| .. | .. |
|---|
| 38 | 38 | #define CR_ENABLE_BIT_OFFSET 0xF3F04 |
|---|
| 39 | 39 | #define MAX_NUM_OF_DUMPS_TO_STORE (8) |
|---|
| 40 | 40 | |
|---|
| 41 | | -static const char *region_cr_space_str = "cr-space"; |
|---|
| 42 | | -static const char *region_fw_health_str = "fw-health"; |
|---|
| 41 | +#define REGION_CR_SPACE "cr-space" |
|---|
| 42 | +#define REGION_FW_HEALTH "fw-health" |
|---|
| 43 | + |
|---|
| 44 | +static const char * const region_cr_space_str = REGION_CR_SPACE; |
|---|
| 45 | +static const char * const region_fw_health_str = REGION_FW_HEALTH; |
|---|
| 46 | + |
|---|
| 47 | +static const struct devlink_region_ops region_cr_space_ops = { |
|---|
| 48 | + .name = REGION_CR_SPACE, |
|---|
| 49 | + .destructor = &kvfree, |
|---|
| 50 | +}; |
|---|
| 51 | + |
|---|
| 52 | +static const struct devlink_region_ops region_fw_health_ops = { |
|---|
| 53 | + .name = REGION_FW_HEALTH, |
|---|
| 54 | + .destructor = &kvfree, |
|---|
| 55 | +}; |
|---|
| 43 | 56 | |
|---|
| 44 | 57 | /* Set to true in case cr enable bit was set to true before crdump */ |
|---|
| 45 | 58 | static bool crdump_enbale_bit_set; |
|---|
| .. | .. |
|---|
| 99 | 112 | readl(cr_space + offset); |
|---|
| 100 | 113 | |
|---|
| 101 | 114 | err = devlink_region_snapshot_create(crdump->region_crspace, |
|---|
| 102 | | - cr_res_size, crspace_data, |
|---|
| 103 | | - id, &kvfree); |
|---|
| 115 | + crspace_data, id); |
|---|
| 104 | 116 | if (err) { |
|---|
| 105 | 117 | kvfree(crspace_data); |
|---|
| 106 | 118 | mlx4_warn(dev, "crdump: devlink create %s snapshot id %d err %d\n", |
|---|
| .. | .. |
|---|
| 139 | 151 | readl(health_buf_start + offset); |
|---|
| 140 | 152 | |
|---|
| 141 | 153 | err = devlink_region_snapshot_create(crdump->region_fw_health, |
|---|
| 142 | | - HEALTH_BUFFER_SIZE, |
|---|
| 143 | | - health_data, |
|---|
| 144 | | - id, &kvfree); |
|---|
| 154 | + health_data, id); |
|---|
| 145 | 155 | if (err) { |
|---|
| 146 | 156 | kvfree(health_data); |
|---|
| 147 | 157 | mlx4_warn(dev, "crdump: devlink create %s snapshot id %d err %d\n", |
|---|
| .. | .. |
|---|
| 162 | 172 | struct pci_dev *pdev = dev->persist->pdev; |
|---|
| 163 | 173 | unsigned long cr_res_size; |
|---|
| 164 | 174 | u8 __iomem *cr_space; |
|---|
| 175 | + int err; |
|---|
| 165 | 176 | u32 id; |
|---|
| 166 | 177 | |
|---|
| 167 | 178 | if (!dev->caps.health_buffer_addrs) { |
|---|
| .. | .. |
|---|
| 182 | 193 | return -ENODEV; |
|---|
| 183 | 194 | } |
|---|
| 184 | 195 | |
|---|
| 185 | | - crdump_enable_crspace_access(dev, cr_space); |
|---|
| 186 | | - |
|---|
| 187 | 196 | /* Get the available snapshot ID for the dumps */ |
|---|
| 188 | | - id = devlink_region_shapshot_id_get(devlink); |
|---|
| 197 | + err = devlink_region_snapshot_id_get(devlink, &id); |
|---|
| 198 | + if (err) { |
|---|
| 199 | + mlx4_err(dev, "crdump: devlink get snapshot id err %d\n", err); |
|---|
| 200 | + iounmap(cr_space); |
|---|
| 201 | + return err; |
|---|
| 202 | + } |
|---|
| 203 | + |
|---|
| 204 | + crdump_enable_crspace_access(dev, cr_space); |
|---|
| 189 | 205 | |
|---|
| 190 | 206 | /* Try to capture dumps */ |
|---|
| 191 | 207 | mlx4_crdump_collect_crspace(dev, cr_space, id); |
|---|
| 192 | 208 | mlx4_crdump_collect_fw_health(dev, cr_space, id); |
|---|
| 209 | + |
|---|
| 210 | + /* Release reference on the snapshot id */ |
|---|
| 211 | + devlink_region_snapshot_id_put(devlink, id); |
|---|
| 193 | 212 | |
|---|
| 194 | 213 | crdump_disable_crspace_access(dev, cr_space); |
|---|
| 195 | 214 | |
|---|
| .. | .. |
|---|
| 208 | 227 | /* Create cr-space region */ |
|---|
| 209 | 228 | crdump->region_crspace = |
|---|
| 210 | 229 | devlink_region_create(devlink, |
|---|
| 211 | | - region_cr_space_str, |
|---|
| 230 | + ®ion_cr_space_ops, |
|---|
| 212 | 231 | MAX_NUM_OF_DUMPS_TO_STORE, |
|---|
| 213 | 232 | pci_resource_len(pdev, 0)); |
|---|
| 214 | 233 | if (IS_ERR(crdump->region_crspace)) |
|---|
| .. | .. |
|---|
| 219 | 238 | /* Create fw-health region */ |
|---|
| 220 | 239 | crdump->region_fw_health = |
|---|
| 221 | 240 | devlink_region_create(devlink, |
|---|
| 222 | | - region_fw_health_str, |
|---|
| 241 | + ®ion_fw_health_ops, |
|---|
| 223 | 242 | MAX_NUM_OF_DUMPS_TO_STORE, |
|---|
| 224 | 243 | HEALTH_BUFFER_SIZE); |
|---|
| 225 | 244 | if (IS_ERR(crdump->region_fw_health)) |
|---|