diff options
author | Arvind Bhushan <arvindb@chelsio.com> | 2013-03-14 01:09:08 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-03-14 11:36:00 -0400 |
commit | 7cc163806b0dc31ea2067d48a2732b452a709f48 (patch) | |
tree | 8211ed0286b901937b89fc01b0c3284d36659d93 /drivers | |
parent | d69630e8a42220b04318995d8ed0637ea79a717e (diff) |
csiostor: Cleanup chip specific operations.
This patch removes chip specific operations from the common hardware
paths, as well as the Makefile change to accomodate the new files.
Signed-off-by: Arvind Bhushan <arvindb@chelsio.com>
Signed-off-by: Naresh Kumar Inna <naresh@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/csiostor/Makefile | 3 | ||||
-rw-r--r-- | drivers/scsi/csiostor/csio_hw.c | 559 | ||||
-rw-r--r-- | drivers/scsi/csiostor/csio_hw.h | 47 | ||||
-rw-r--r-- | drivers/scsi/csiostor/csio_init.c | 48 | ||||
-rw-r--r-- | drivers/scsi/csiostor/csio_init.h | 29 | ||||
-rw-r--r-- | drivers/scsi/csiostor/csio_wr.c | 19 |
6 files changed, 193 insertions, 512 deletions
diff --git a/drivers/scsi/csiostor/Makefile b/drivers/scsi/csiostor/Makefile index b581966c88f9..913b9a92fb06 100644 --- a/drivers/scsi/csiostor/Makefile +++ b/drivers/scsi/csiostor/Makefile | |||
@@ -8,4 +8,5 @@ ccflags-y += -I$(srctree)/drivers/net/ethernet/chelsio/cxgb4 | |||
8 | obj-$(CONFIG_SCSI_CHELSIO_FCOE) += csiostor.o | 8 | obj-$(CONFIG_SCSI_CHELSIO_FCOE) += csiostor.o |
9 | 9 | ||
10 | csiostor-objs := csio_attr.o csio_init.o csio_lnode.o csio_scsi.o \ | 10 | csiostor-objs := csio_attr.o csio_init.o csio_lnode.o csio_scsi.o \ |
11 | csio_hw.o csio_isr.o csio_mb.o csio_rnode.o csio_wr.o | 11 | csio_hw.o csio_hw_t4.o csio_hw_t5.o csio_isr.o \ |
12 | csio_mb.o csio_rnode.o csio_wr.o | ||
diff --git a/drivers/scsi/csiostor/csio_hw.c b/drivers/scsi/csiostor/csio_hw.c index bdd78fb4fc70..a0b4c8991deb 100644 --- a/drivers/scsi/csiostor/csio_hw.c +++ b/drivers/scsi/csiostor/csio_hw.c | |||
@@ -61,7 +61,7 @@ int csio_msi = 2; | |||
61 | static int dev_num; | 61 | static int dev_num; |
62 | 62 | ||
63 | /* FCoE Adapter types & its description */ | 63 | /* FCoE Adapter types & its description */ |
64 | static const struct csio_adap_desc csio_fcoe_adapters[] = { | 64 | static const struct csio_adap_desc csio_t4_fcoe_adapters[] = { |
65 | {"T440-Dbg 10G", "Chelsio T440-Dbg 10G [FCoE]"}, | 65 | {"T440-Dbg 10G", "Chelsio T440-Dbg 10G [FCoE]"}, |
66 | {"T420-CR 10G", "Chelsio T420-CR 10G [FCoE]"}, | 66 | {"T420-CR 10G", "Chelsio T420-CR 10G [FCoE]"}, |
67 | {"T422-CR 10G/1G", "Chelsio T422-CR 10G/1G [FCoE]"}, | 67 | {"T422-CR 10G/1G", "Chelsio T422-CR 10G/1G [FCoE]"}, |
@@ -77,7 +77,38 @@ static const struct csio_adap_desc csio_fcoe_adapters[] = { | |||
77 | {"B404-BT 1G", "Chelsio B404-BT 1G [FCoE]"}, | 77 | {"B404-BT 1G", "Chelsio B404-BT 1G [FCoE]"}, |
78 | {"T480-CR 10G", "Chelsio T480-CR 10G [FCoE]"}, | 78 | {"T480-CR 10G", "Chelsio T480-CR 10G [FCoE]"}, |
79 | {"T440-LP-CR 10G", "Chelsio T440-LP-CR 10G [FCoE]"}, | 79 | {"T440-LP-CR 10G", "Chelsio T440-LP-CR 10G [FCoE]"}, |
80 | {"T4 FPGA", "Chelsio T4 FPGA [FCoE]"} | 80 | {"AMSTERDAM 10G", "Chelsio AMSTERDAM 10G [FCoE]"}, |
81 | {"HUAWEI T480 10G", "Chelsio HUAWEI T480 10G [FCoE]"}, | ||
82 | {"HUAWEI T440 10G", "Chelsio HUAWEI T440 10G [FCoE]"}, | ||
83 | {"HUAWEI STG 10G", "Chelsio HUAWEI STG 10G [FCoE]"}, | ||
84 | {"ACROMAG XAUI 10G", "Chelsio ACROMAG XAUI 10G [FCoE]"}, | ||
85 | {"ACROMAG SFP+ 10G", "Chelsio ACROMAG SFP+ 10G [FCoE]"}, | ||
86 | {"QUANTA SFP+ 10G", "Chelsio QUANTA SFP+ 10G [FCoE]"}, | ||
87 | {"HUAWEI 10Gbase-T", "Chelsio HUAWEI 10Gbase-T [FCoE]"}, | ||
88 | {"HUAWEI T4TOE 10G", "Chelsio HUAWEI T4TOE 10G [FCoE]"} | ||
89 | }; | ||
90 | |||
91 | static const struct csio_adap_desc csio_t5_fcoe_adapters[] = { | ||
92 | {"T580-Dbg 10G", "Chelsio T580-Dbg 10G [FCoE]"}, | ||
93 | {"T520-CR 10G", "Chelsio T520-CR 10G [FCoE]"}, | ||
94 | {"T522-CR 10G/1G", "Chelsio T452-CR 10G/1G [FCoE]"}, | ||
95 | {"T540-CR 10G", "Chelsio T540-CR 10G [FCoE]"}, | ||
96 | {"T520-BCH 10G", "Chelsio T520-BCH 10G [FCoE]"}, | ||
97 | {"T540-BCH 10G", "Chelsio T540-BCH 10G [FCoE]"}, | ||
98 | {"T540-CH 10G", "Chelsio T540-CH 10G [FCoE]"}, | ||
99 | {"T520-SO 10G", "Chelsio T520-SO 10G [FCoE]"}, | ||
100 | {"T520-CX4 10G", "Chelsio T520-CX4 10G [FCoE]"}, | ||
101 | {"T520-BT 10G", "Chelsio T520-BT 10G [FCoE]"}, | ||
102 | {"T504-BT 1G", "Chelsio T504-BT 1G [FCoE]"}, | ||
103 | {"B520-SR 10G", "Chelsio B520-SR 10G [FCoE]"}, | ||
104 | {"B504-BT 1G", "Chelsio B504-BT 1G [FCoE]"}, | ||
105 | {"T580-CR 10G", "Chelsio T580-CR 10G [FCoE]"}, | ||
106 | {"T540-LP-CR 10G", "Chelsio T540-LP-CR 10G [FCoE]"}, | ||
107 | {"AMSTERDAM 10G", "Chelsio AMSTERDAM 10G [FCoE]"}, | ||
108 | {"T580-LP-CR 40G", "Chelsio T580-LP-CR 40G [FCoE]"}, | ||
109 | {"T520-LL-CR 10G", "Chelsio T520-LL-CR 10G [FCoE]"}, | ||
110 | {"T560-CR 40G", "Chelsio T560-CR 40G [FCoE]"}, | ||
111 | {"T580-CR 40G", "Chelsio T580-CR 40G [FCoE]"} | ||
81 | }; | 112 | }; |
82 | 113 | ||
83 | static void csio_mgmtm_cleanup(struct csio_mgmtm *); | 114 | static void csio_mgmtm_cleanup(struct csio_mgmtm *); |
@@ -124,7 +155,7 @@ int csio_is_hw_removing(struct csio_hw *hw) | |||
124 | * at the time it indicated completion is stored there. Returns 0 if the | 155 | * at the time it indicated completion is stored there. Returns 0 if the |
125 | * operation completes and -EAGAIN otherwise. | 156 | * operation completes and -EAGAIN otherwise. |
126 | */ | 157 | */ |
127 | static int | 158 | int |
128 | csio_hw_wait_op_done_val(struct csio_hw *hw, int reg, uint32_t mask, | 159 | csio_hw_wait_op_done_val(struct csio_hw *hw, int reg, uint32_t mask, |
129 | int polarity, int attempts, int delay, uint32_t *valp) | 160 | int polarity, int attempts, int delay, uint32_t *valp) |
130 | { | 161 | { |
@@ -145,6 +176,24 @@ csio_hw_wait_op_done_val(struct csio_hw *hw, int reg, uint32_t mask, | |||
145 | } | 176 | } |
146 | } | 177 | } |
147 | 178 | ||
179 | /* | ||
180 | * csio_hw_tp_wr_bits_indirect - set/clear bits in an indirect TP register | ||
181 | * @hw: the adapter | ||
182 | * @addr: the indirect TP register address | ||
183 | * @mask: specifies the field within the register to modify | ||
184 | * @val: new value for the field | ||
185 | * | ||
186 | * Sets a field of an indirect TP register to the given value. | ||
187 | */ | ||
188 | void | ||
189 | csio_hw_tp_wr_bits_indirect(struct csio_hw *hw, unsigned int addr, | ||
190 | unsigned int mask, unsigned int val) | ||
191 | { | ||
192 | csio_wr_reg32(hw, addr, TP_PIO_ADDR); | ||
193 | val |= csio_rd_reg32(hw, TP_PIO_DATA) & ~mask; | ||
194 | csio_wr_reg32(hw, val, TP_PIO_DATA); | ||
195 | } | ||
196 | |||
148 | void | 197 | void |
149 | csio_set_reg_field(struct csio_hw *hw, uint32_t reg, uint32_t mask, | 198 | csio_set_reg_field(struct csio_hw *hw, uint32_t reg, uint32_t mask, |
150 | uint32_t value) | 199 | uint32_t value) |
@@ -157,242 +206,22 @@ csio_set_reg_field(struct csio_hw *hw, uint32_t reg, uint32_t mask, | |||
157 | 206 | ||
158 | } | 207 | } |
159 | 208 | ||
160 | /* | ||
161 | * csio_hw_mc_read - read from MC through backdoor accesses | ||
162 | * @hw: the hw module | ||
163 | * @addr: address of first byte requested | ||
164 | * @data: 64 bytes of data containing the requested address | ||
165 | * @ecc: where to store the corresponding 64-bit ECC word | ||
166 | * | ||
167 | * Read 64 bytes of data from MC starting at a 64-byte-aligned address | ||
168 | * that covers the requested address @addr. If @parity is not %NULL it | ||
169 | * is assigned the 64-bit ECC word for the read data. | ||
170 | */ | ||
171 | int | ||
172 | csio_hw_mc_read(struct csio_hw *hw, uint32_t addr, __be32 *data, | ||
173 | uint64_t *ecc) | ||
174 | { | ||
175 | int i; | ||
176 | |||
177 | if (csio_rd_reg32(hw, MC_BIST_CMD) & START_BIST) | ||
178 | return -EBUSY; | ||
179 | csio_wr_reg32(hw, addr & ~0x3fU, MC_BIST_CMD_ADDR); | ||
180 | csio_wr_reg32(hw, 64, MC_BIST_CMD_LEN); | ||
181 | csio_wr_reg32(hw, 0xc, MC_BIST_DATA_PATTERN); | ||
182 | csio_wr_reg32(hw, BIST_OPCODE(1) | START_BIST | BIST_CMD_GAP(1), | ||
183 | MC_BIST_CMD); | ||
184 | i = csio_hw_wait_op_done_val(hw, MC_BIST_CMD, START_BIST, | ||
185 | 0, 10, 1, NULL); | ||
186 | if (i) | ||
187 | return i; | ||
188 | |||
189 | #define MC_DATA(i) MC_BIST_STATUS_REG(MC_BIST_STATUS_RDATA, i) | ||
190 | |||
191 | for (i = 15; i >= 0; i--) | ||
192 | *data++ = htonl(csio_rd_reg32(hw, MC_DATA(i))); | ||
193 | if (ecc) | ||
194 | *ecc = csio_rd_reg64(hw, MC_DATA(16)); | ||
195 | #undef MC_DATA | ||
196 | return 0; | ||
197 | } | ||
198 | |||
199 | /* | ||
200 | * csio_hw_edc_read - read from EDC through backdoor accesses | ||
201 | * @hw: the hw module | ||
202 | * @idx: which EDC to access | ||
203 | * @addr: address of first byte requested | ||
204 | * @data: 64 bytes of data containing the requested address | ||
205 | * @ecc: where to store the corresponding 64-bit ECC word | ||
206 | * | ||
207 | * Read 64 bytes of data from EDC starting at a 64-byte-aligned address | ||
208 | * that covers the requested address @addr. If @parity is not %NULL it | ||
209 | * is assigned the 64-bit ECC word for the read data. | ||
210 | */ | ||
211 | int | ||
212 | csio_hw_edc_read(struct csio_hw *hw, int idx, uint32_t addr, __be32 *data, | ||
213 | uint64_t *ecc) | ||
214 | { | ||
215 | int i; | ||
216 | |||
217 | idx *= EDC_STRIDE; | ||
218 | if (csio_rd_reg32(hw, EDC_BIST_CMD + idx) & START_BIST) | ||
219 | return -EBUSY; | ||
220 | csio_wr_reg32(hw, addr & ~0x3fU, EDC_BIST_CMD_ADDR + idx); | ||
221 | csio_wr_reg32(hw, 64, EDC_BIST_CMD_LEN + idx); | ||
222 | csio_wr_reg32(hw, 0xc, EDC_BIST_DATA_PATTERN + idx); | ||
223 | csio_wr_reg32(hw, BIST_OPCODE(1) | BIST_CMD_GAP(1) | START_BIST, | ||
224 | EDC_BIST_CMD + idx); | ||
225 | i = csio_hw_wait_op_done_val(hw, EDC_BIST_CMD + idx, START_BIST, | ||
226 | 0, 10, 1, NULL); | ||
227 | if (i) | ||
228 | return i; | ||
229 | |||
230 | #define EDC_DATA(i) (EDC_BIST_STATUS_REG(EDC_BIST_STATUS_RDATA, i) + idx) | ||
231 | |||
232 | for (i = 15; i >= 0; i--) | ||
233 | *data++ = htonl(csio_rd_reg32(hw, EDC_DATA(i))); | ||
234 | if (ecc) | ||
235 | *ecc = csio_rd_reg64(hw, EDC_DATA(16)); | ||
236 | #undef EDC_DATA | ||
237 | return 0; | ||
238 | } | ||
239 | |||
240 | /* | ||
241 | * csio_mem_win_rw - read/write memory through PCIE memory window | ||
242 | * @hw: the adapter | ||
243 | * @addr: address of first byte requested | ||
244 | * @data: MEMWIN0_APERTURE bytes of data containing the requested address | ||
245 | * @dir: direction of transfer 1 => read, 0 => write | ||
246 | * | ||
247 | * Read/write MEMWIN0_APERTURE bytes of data from MC starting at a | ||
248 | * MEMWIN0_APERTURE-byte-aligned address that covers the requested | ||
249 | * address @addr. | ||
250 | */ | ||
251 | static int | ||
252 | csio_mem_win_rw(struct csio_hw *hw, u32 addr, u32 *data, int dir) | ||
253 | { | ||
254 | int i; | ||
255 | |||
256 | /* | ||
257 | * Setup offset into PCIE memory window. Address must be a | ||
258 | * MEMWIN0_APERTURE-byte-aligned address. (Read back MA register to | ||
259 | * ensure that changes propagate before we attempt to use the new | ||
260 | * values.) | ||
261 | */ | ||
262 | csio_wr_reg32(hw, addr & ~(MEMWIN0_APERTURE - 1), | ||
263 | PCIE_MEM_ACCESS_OFFSET); | ||
264 | csio_rd_reg32(hw, PCIE_MEM_ACCESS_OFFSET); | ||
265 | |||
266 | /* Collecting data 4 bytes at a time upto MEMWIN0_APERTURE */ | ||
267 | for (i = 0; i < MEMWIN0_APERTURE; i = i + sizeof(__be32)) { | ||
268 | if (dir) | ||
269 | *data++ = csio_rd_reg32(hw, (MEMWIN0_BASE + i)); | ||
270 | else | ||
271 | csio_wr_reg32(hw, *data++, (MEMWIN0_BASE + i)); | ||
272 | } | ||
273 | |||
274 | return 0; | ||
275 | } | ||
276 | |||
277 | /* | ||
278 | * csio_memory_rw - read/write EDC 0, EDC 1 or MC via PCIE memory window | ||
279 | * @hw: the csio_hw | ||
280 | * @mtype: memory type: MEM_EDC0, MEM_EDC1 or MEM_MC | ||
281 | * @addr: address within indicated memory type | ||
282 | * @len: amount of memory to transfer | ||
283 | * @buf: host memory buffer | ||
284 | * @dir: direction of transfer 1 => read, 0 => write | ||
285 | * | ||
286 | * Reads/writes an [almost] arbitrary memory region in the firmware: the | ||
287 | * firmware memory address, length and host buffer must be aligned on | ||
288 | * 32-bit boudaries. The memory is transferred as a raw byte sequence | ||
289 | * from/to the firmware's memory. If this memory contains data | ||
290 | * structures which contain multi-byte integers, it's the callers | ||
291 | * responsibility to perform appropriate byte order conversions. | ||
292 | */ | ||
293 | static int | ||
294 | csio_memory_rw(struct csio_hw *hw, int mtype, u32 addr, u32 len, | ||
295 | uint32_t *buf, int dir) | ||
296 | { | ||
297 | uint32_t pos, start, end, offset, memoffset; | ||
298 | int ret; | ||
299 | uint32_t *data; | ||
300 | |||
301 | /* | ||
302 | * Argument sanity checks ... | ||
303 | */ | ||
304 | if ((addr & 0x3) || (len & 0x3)) | ||
305 | return -EINVAL; | ||
306 | |||
307 | data = kzalloc(MEMWIN0_APERTURE, GFP_KERNEL); | ||
308 | if (!data) | ||
309 | return -ENOMEM; | ||
310 | |||
311 | /* Offset into the region of memory which is being accessed | ||
312 | * MEM_EDC0 = 0 | ||
313 | * MEM_EDC1 = 1 | ||
314 | * MEM_MC = 2 | ||
315 | */ | ||
316 | memoffset = (mtype * (5 * 1024 * 1024)); | ||
317 | |||
318 | /* Determine the PCIE_MEM_ACCESS_OFFSET */ | ||
319 | addr = addr + memoffset; | ||
320 | |||
321 | /* | ||
322 | * The underlaying EDC/MC read routines read MEMWIN0_APERTURE bytes | ||
323 | * at a time so we need to round down the start and round up the end. | ||
324 | * We'll start copying out of the first line at (addr - start) a word | ||
325 | * at a time. | ||
326 | */ | ||
327 | start = addr & ~(MEMWIN0_APERTURE-1); | ||
328 | end = (addr + len + MEMWIN0_APERTURE-1) & ~(MEMWIN0_APERTURE-1); | ||
329 | offset = (addr - start)/sizeof(__be32); | ||
330 | |||
331 | for (pos = start; pos < end; pos += MEMWIN0_APERTURE, offset = 0) { | ||
332 | /* | ||
333 | * If we're writing, copy the data from the caller's memory | ||
334 | * buffer | ||
335 | */ | ||
336 | if (!dir) { | ||
337 | /* | ||
338 | * If we're doing a partial write, then we need to do | ||
339 | * a read-modify-write ... | ||
340 | */ | ||
341 | if (offset || len < MEMWIN0_APERTURE) { | ||
342 | ret = csio_mem_win_rw(hw, pos, data, 1); | ||
343 | if (ret) { | ||
344 | kfree(data); | ||
345 | return ret; | ||
346 | } | ||
347 | } | ||
348 | while (offset < (MEMWIN0_APERTURE/sizeof(__be32)) && | ||
349 | len > 0) { | ||
350 | data[offset++] = *buf++; | ||
351 | len -= sizeof(__be32); | ||
352 | } | ||
353 | } | ||
354 | |||
355 | /* | ||
356 | * Transfer a block of memory and bail if there's an error. | ||
357 | */ | ||
358 | ret = csio_mem_win_rw(hw, pos, data, dir); | ||
359 | if (ret) { | ||
360 | kfree(data); | ||
361 | return ret; | ||
362 | } | ||
363 | |||
364 | /* | ||
365 | * If we're reading, copy the data into the caller's memory | ||
366 | * buffer. | ||
367 | */ | ||
368 | if (dir) | ||
369 | while (offset < (MEMWIN0_APERTURE/sizeof(__be32)) && | ||
370 | len > 0) { | ||
371 | *buf++ = data[offset++]; | ||
372 | len -= sizeof(__be32); | ||
373 | } | ||
374 | } | ||
375 | |||
376 | kfree(data); | ||
377 | |||
378 | return 0; | ||
379 | } | ||
380 | |||
381 | static int | 209 | static int |
382 | csio_memory_write(struct csio_hw *hw, int mtype, u32 addr, u32 len, u32 *buf) | 210 | csio_memory_write(struct csio_hw *hw, int mtype, u32 addr, u32 len, u32 *buf) |
383 | { | 211 | { |
384 | return csio_memory_rw(hw, mtype, addr, len, buf, 0); | 212 | return hw->chip_ops->chip_memory_rw(hw, MEMWIN_CSIOSTOR, mtype, |
213 | addr, len, buf, 0); | ||
385 | } | 214 | } |
386 | 215 | ||
387 | /* | 216 | /* |
388 | * EEPROM reads take a few tens of us while writes can take a bit over 5 ms. | 217 | * EEPROM reads take a few tens of us while writes can take a bit over 5 ms. |
389 | */ | 218 | */ |
390 | #define EEPROM_MAX_RD_POLL 40 | 219 | #define EEPROM_MAX_RD_POLL 40 |
391 | #define EEPROM_MAX_WR_POLL 6 | 220 | #define EEPROM_MAX_WR_POLL 6 |
392 | #define EEPROM_STAT_ADDR 0x7bfc | 221 | #define EEPROM_STAT_ADDR 0x7bfc |
393 | #define VPD_BASE 0x400 | 222 | #define VPD_BASE 0x400 |
394 | #define VPD_BASE_OLD 0 | 223 | #define VPD_BASE_OLD 0 |
395 | #define VPD_LEN 512 | 224 | #define VPD_LEN 1024 |
396 | #define VPD_INFO_FLD_HDR_SIZE 3 | 225 | #define VPD_INFO_FLD_HDR_SIZE 3 |
397 | 226 | ||
398 | /* | 227 | /* |
@@ -817,23 +646,6 @@ out: | |||
817 | return 0; | 646 | return 0; |
818 | } | 647 | } |
819 | 648 | ||
820 | /* | ||
821 | * csio_hw_flash_cfg_addr - return the address of the flash | ||
822 | * configuration file | ||
823 | * @hw: the HW module | ||
824 | * | ||
825 | * Return the address within the flash where the Firmware Configuration | ||
826 | * File is stored. | ||
827 | */ | ||
828 | static unsigned int | ||
829 | csio_hw_flash_cfg_addr(struct csio_hw *hw) | ||
830 | { | ||
831 | if (hw->params.sf_size == 0x100000) | ||
832 | return FPGA_FLASH_CFG_OFFSET; | ||
833 | else | ||
834 | return FLASH_CFG_OFFSET; | ||
835 | } | ||
836 | |||
837 | static void | 649 | static void |
838 | csio_hw_print_fw_version(struct csio_hw *hw, char *str) | 650 | csio_hw_print_fw_version(struct csio_hw *hw, char *str) |
839 | { | 651 | { |
@@ -898,13 +710,13 @@ csio_hw_check_fw_version(struct csio_hw *hw) | |||
898 | minor = FW_HDR_FW_VER_MINOR_GET(hw->fwrev); | 710 | minor = FW_HDR_FW_VER_MINOR_GET(hw->fwrev); |
899 | micro = FW_HDR_FW_VER_MICRO_GET(hw->fwrev); | 711 | micro = FW_HDR_FW_VER_MICRO_GET(hw->fwrev); |
900 | 712 | ||
901 | if (major != FW_VERSION_MAJOR) { /* major mismatch - fail */ | 713 | if (major != FW_VERSION_MAJOR(hw)) { /* major mismatch - fail */ |
902 | csio_err(hw, "card FW has major version %u, driver wants %u\n", | 714 | csio_err(hw, "card FW has major version %u, driver wants %u\n", |
903 | major, FW_VERSION_MAJOR); | 715 | major, FW_VERSION_MAJOR(hw)); |
904 | return -EINVAL; | 716 | return -EINVAL; |
905 | } | 717 | } |
906 | 718 | ||
907 | if (minor == FW_VERSION_MINOR && micro == FW_VERSION_MICRO) | 719 | if (minor == FW_VERSION_MINOR(hw) && micro == FW_VERSION_MICRO(hw)) |
908 | return 0; /* perfect match */ | 720 | return 0; /* perfect match */ |
909 | 721 | ||
910 | /* Minor/micro version mismatch */ | 722 | /* Minor/micro version mismatch */ |
@@ -1044,7 +856,7 @@ static void | |||
1044 | csio_set_pcie_completion_timeout(struct csio_hw *hw, u8 range) | 856 | csio_set_pcie_completion_timeout(struct csio_hw *hw, u8 range) |
1045 | { | 857 | { |
1046 | uint16_t val; | 858 | uint16_t val; |
1047 | uint32_t pcie_cap; | 859 | int pcie_cap; |
1048 | 860 | ||
1049 | if (!csio_pci_capability(hw->pdev, PCI_CAP_ID_EXP, &pcie_cap)) { | 861 | if (!csio_pci_capability(hw->pdev, PCI_CAP_ID_EXP, &pcie_cap)) { |
1050 | pci_read_config_word(hw->pdev, | 862 | pci_read_config_word(hw->pdev, |
@@ -1056,84 +868,6 @@ csio_set_pcie_completion_timeout(struct csio_hw *hw, u8 range) | |||
1056 | } | 868 | } |
1057 | } | 869 | } |
1058 | 870 | ||
1059 | |||
1060 | /* | ||
1061 | * Return the specified PCI-E Configuration Space register from our Physical | ||
1062 | * Function. We try first via a Firmware LDST Command since we prefer to let | ||
1063 | * the firmware own all of these registers, but if that fails we go for it | ||
1064 | * directly ourselves. | ||
1065 | */ | ||
1066 | static uint32_t | ||
1067 | csio_read_pcie_cfg4(struct csio_hw *hw, int reg) | ||
1068 | { | ||
1069 | u32 val = 0; | ||
1070 | struct csio_mb *mbp; | ||
1071 | int rv; | ||
1072 | struct fw_ldst_cmd *ldst_cmd; | ||
1073 | |||
1074 | mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC); | ||
1075 | if (!mbp) { | ||
1076 | CSIO_INC_STATS(hw, n_err_nomem); | ||
1077 | pci_read_config_dword(hw->pdev, reg, &val); | ||
1078 | return val; | ||
1079 | } | ||
1080 | |||
1081 | csio_mb_ldst(hw, mbp, CSIO_MB_DEFAULT_TMO, reg); | ||
1082 | |||
1083 | rv = csio_mb_issue(hw, mbp); | ||
1084 | |||
1085 | /* | ||
1086 | * If the LDST Command suucceeded, exctract the returned register | ||
1087 | * value. Otherwise read it directly ourself. | ||
1088 | */ | ||
1089 | if (rv == 0) { | ||
1090 | ldst_cmd = (struct fw_ldst_cmd *)(mbp->mb); | ||
1091 | val = ntohl(ldst_cmd->u.pcie.data[0]); | ||
1092 | } else | ||
1093 | pci_read_config_dword(hw->pdev, reg, &val); | ||
1094 | |||
1095 | mempool_free(mbp, hw->mb_mempool); | ||
1096 | |||
1097 | return val; | ||
1098 | } /* csio_read_pcie_cfg4 */ | ||
1099 | |||
1100 | static int | ||
1101 | csio_hw_set_mem_win(struct csio_hw *hw) | ||
1102 | { | ||
1103 | u32 bar0; | ||
1104 | |||
1105 | /* | ||
1106 | * Truncation intentional: we only read the bottom 32-bits of the | ||
1107 | * 64-bit BAR0/BAR1 ... We use the hardware backdoor mechanism to | ||
1108 | * read BAR0 instead of using pci_resource_start() because we could be | ||
1109 | * operating from within a Virtual Machine which is trapping our | ||
1110 | * accesses to our Configuration Space and we need to set up the PCI-E | ||
1111 | * Memory Window decoders with the actual addresses which will be | ||
1112 | * coming across the PCI-E link. | ||
1113 | */ | ||
1114 | bar0 = csio_read_pcie_cfg4(hw, PCI_BASE_ADDRESS_0); | ||
1115 | bar0 &= PCI_BASE_ADDRESS_MEM_MASK; | ||
1116 | |||
1117 | /* | ||
1118 | * Set up memory window for accessing adapter memory ranges. (Read | ||
1119 | * back MA register to ensure that changes propagate before we attempt | ||
1120 | * to use the new values.) | ||
1121 | */ | ||
1122 | csio_wr_reg32(hw, (bar0 + MEMWIN0_BASE) | BIR(0) | | ||
1123 | WINDOW(ilog2(MEMWIN0_APERTURE) - 10), | ||
1124 | PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN, 0)); | ||
1125 | csio_wr_reg32(hw, (bar0 + MEMWIN1_BASE) | BIR(0) | | ||
1126 | WINDOW(ilog2(MEMWIN1_APERTURE) - 10), | ||
1127 | PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN, 1)); | ||
1128 | csio_wr_reg32(hw, (bar0 + MEMWIN2_BASE) | BIR(0) | | ||
1129 | WINDOW(ilog2(MEMWIN2_APERTURE) - 10), | ||
1130 | PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN, 2)); | ||
1131 | csio_rd_reg32(hw, PCIE_MEM_ACCESS_REG(PCIE_MEM_ACCESS_BASE_WIN, 2)); | ||
1132 | return 0; | ||
1133 | } /* csio_hw_set_mem_win */ | ||
1134 | |||
1135 | |||
1136 | |||
1137 | /*****************************************************************************/ | 871 | /*****************************************************************************/ |
1138 | /* HW State machine assists */ | 872 | /* HW State machine assists */ |
1139 | /*****************************************************************************/ | 873 | /*****************************************************************************/ |
@@ -1234,7 +968,9 @@ retry: | |||
1234 | for (;;) { | 968 | for (;;) { |
1235 | uint32_t pcie_fw; | 969 | uint32_t pcie_fw; |
1236 | 970 | ||
971 | spin_unlock_irq(&hw->lock); | ||
1237 | msleep(50); | 972 | msleep(50); |
973 | spin_lock_irq(&hw->lock); | ||
1238 | waiting -= 50; | 974 | waiting -= 50; |
1239 | 975 | ||
1240 | /* | 976 | /* |
@@ -2121,9 +1857,9 @@ csio_hw_flash_config(struct csio_hw *hw, u32 *fw_cfg_param, char *path) | |||
2121 | uint32_t *cfg_data; | 1857 | uint32_t *cfg_data; |
2122 | int value_to_add = 0; | 1858 | int value_to_add = 0; |
2123 | 1859 | ||
2124 | if (request_firmware(&cf, CSIO_CF_FNAME, dev) < 0) { | 1860 | if (request_firmware(&cf, CSIO_CF_FNAME(hw), dev) < 0) { |
2125 | csio_err(hw, "could not find config file " CSIO_CF_FNAME | 1861 | csio_err(hw, "could not find config file %s, err: %d\n", |
2126 | ",err: %d\n", ret); | 1862 | CSIO_CF_FNAME(hw), ret); |
2127 | return -ENOENT; | 1863 | return -ENOENT; |
2128 | } | 1864 | } |
2129 | 1865 | ||
@@ -2147,9 +1883,24 @@ csio_hw_flash_config(struct csio_hw *hw, u32 *fw_cfg_param, char *path) | |||
2147 | 1883 | ||
2148 | ret = csio_memory_write(hw, mtype, maddr, | 1884 | ret = csio_memory_write(hw, mtype, maddr, |
2149 | cf->size + value_to_add, cfg_data); | 1885 | cf->size + value_to_add, cfg_data); |
1886 | |||
1887 | if ((ret == 0) && (value_to_add != 0)) { | ||
1888 | union { | ||
1889 | u32 word; | ||
1890 | char buf[4]; | ||
1891 | } last; | ||
1892 | size_t size = cf->size & ~0x3; | ||
1893 | int i; | ||
1894 | |||
1895 | last.word = cfg_data[size >> 2]; | ||
1896 | for (i = value_to_add; i < 4; i++) | ||
1897 | last.buf[i] = 0; | ||
1898 | ret = csio_memory_write(hw, mtype, maddr + size, 4, &last.word); | ||
1899 | } | ||
2150 | if (ret == 0) { | 1900 | if (ret == 0) { |
2151 | csio_info(hw, "config file upgraded to " CSIO_CF_FNAME "\n"); | 1901 | csio_info(hw, "config file upgraded to %s\n", |
2152 | strncpy(path, "/lib/firmware/" CSIO_CF_FNAME, 64); | 1902 | CSIO_CF_FNAME(hw)); |
1903 | snprintf(path, 64, "%s%s", "/lib/firmware/", CSIO_CF_FNAME(hw)); | ||
2153 | } | 1904 | } |
2154 | 1905 | ||
2155 | leave: | 1906 | leave: |
@@ -2179,7 +1930,7 @@ csio_hw_use_fwconfig(struct csio_hw *hw, int reset, u32 *fw_cfg_param) | |||
2179 | { | 1930 | { |
2180 | unsigned int mtype, maddr; | 1931 | unsigned int mtype, maddr; |
2181 | int rv; | 1932 | int rv; |
2182 | uint32_t finiver, finicsum, cfcsum; | 1933 | uint32_t finiver = 0, finicsum = 0, cfcsum = 0; |
2183 | int using_flash; | 1934 | int using_flash; |
2184 | char path[64]; | 1935 | char path[64]; |
2185 | 1936 | ||
@@ -2207,7 +1958,7 @@ csio_hw_use_fwconfig(struct csio_hw *hw, int reset, u32 *fw_cfg_param) | |||
2207 | * config file from flash. | 1958 | * config file from flash. |
2208 | */ | 1959 | */ |
2209 | mtype = FW_MEMTYPE_CF_FLASH; | 1960 | mtype = FW_MEMTYPE_CF_FLASH; |
2210 | maddr = csio_hw_flash_cfg_addr(hw); | 1961 | maddr = hw->chip_ops->chip_flash_cfg_addr(hw); |
2211 | using_flash = 1; | 1962 | using_flash = 1; |
2212 | } else { | 1963 | } else { |
2213 | /* | 1964 | /* |
@@ -2346,30 +2097,32 @@ csio_hw_flash_fw(struct csio_hw *hw) | |||
2346 | struct pci_dev *pci_dev = hw->pdev; | 2097 | struct pci_dev *pci_dev = hw->pdev; |
2347 | struct device *dev = &pci_dev->dev ; | 2098 | struct device *dev = &pci_dev->dev ; |
2348 | 2099 | ||
2349 | if (request_firmware(&fw, CSIO_FW_FNAME, dev) < 0) { | 2100 | if (request_firmware(&fw, CSIO_FW_FNAME(hw), dev) < 0) { |
2350 | csio_err(hw, "could not find firmware image " CSIO_FW_FNAME | 2101 | csio_err(hw, "could not find firmware image %s, err: %d\n", |
2351 | ",err: %d\n", ret); | 2102 | CSIO_FW_FNAME(hw), ret); |
2352 | return -EINVAL; | 2103 | return -EINVAL; |
2353 | } | 2104 | } |
2354 | 2105 | ||
2355 | hdr = (const struct fw_hdr *)fw->data; | 2106 | hdr = (const struct fw_hdr *)fw->data; |
2356 | fw_ver = ntohl(hdr->fw_ver); | 2107 | fw_ver = ntohl(hdr->fw_ver); |
2357 | if (FW_HDR_FW_VER_MAJOR_GET(fw_ver) != FW_VERSION_MAJOR) | 2108 | if (FW_HDR_FW_VER_MAJOR_GET(fw_ver) != FW_VERSION_MAJOR(hw)) |
2358 | return -EINVAL; /* wrong major version, won't do */ | 2109 | return -EINVAL; /* wrong major version, won't do */ |
2359 | 2110 | ||
2360 | /* | 2111 | /* |
2361 | * If the flash FW is unusable or we found something newer, load it. | 2112 | * If the flash FW is unusable or we found something newer, load it. |
2362 | */ | 2113 | */ |
2363 | if (FW_HDR_FW_VER_MAJOR_GET(hw->fwrev) != FW_VERSION_MAJOR || | 2114 | if (FW_HDR_FW_VER_MAJOR_GET(hw->fwrev) != FW_VERSION_MAJOR(hw) || |
2364 | fw_ver > hw->fwrev) { | 2115 | fw_ver > hw->fwrev) { |
2365 | ret = csio_hw_fw_upgrade(hw, hw->pfn, fw->data, fw->size, | 2116 | ret = csio_hw_fw_upgrade(hw, hw->pfn, fw->data, fw->size, |
2366 | /*force=*/false); | 2117 | /*force=*/false); |
2367 | if (!ret) | 2118 | if (!ret) |
2368 | csio_info(hw, "firmware upgraded to version %pI4 from " | 2119 | csio_info(hw, |
2369 | CSIO_FW_FNAME "\n", &hdr->fw_ver); | 2120 | "firmware upgraded to version %pI4 from %s\n", |
2121 | &hdr->fw_ver, CSIO_FW_FNAME(hw)); | ||
2370 | else | 2122 | else |
2371 | csio_err(hw, "firmware upgrade failed! err=%d\n", ret); | 2123 | csio_err(hw, "firmware upgrade failed! err=%d\n", ret); |
2372 | } | 2124 | } else |
2125 | ret = -EINVAL; | ||
2373 | 2126 | ||
2374 | release_firmware(fw); | 2127 | release_firmware(fw); |
2375 | 2128 | ||
@@ -2410,7 +2163,7 @@ csio_hw_configure(struct csio_hw *hw) | |||
2410 | /* Set pci completion timeout value to 4 seconds. */ | 2163 | /* Set pci completion timeout value to 4 seconds. */ |
2411 | csio_set_pcie_completion_timeout(hw, 0xd); | 2164 | csio_set_pcie_completion_timeout(hw, 0xd); |
2412 | 2165 | ||
2413 | csio_hw_set_mem_win(hw); | 2166 | hw->chip_ops->chip_set_mem_win(hw, MEMWIN_CSIOSTOR); |
2414 | 2167 | ||
2415 | rv = csio_hw_get_fw_version(hw, &hw->fwrev); | 2168 | rv = csio_hw_get_fw_version(hw, &hw->fwrev); |
2416 | if (rv != 0) | 2169 | if (rv != 0) |
@@ -2478,6 +2231,8 @@ csio_hw_configure(struct csio_hw *hw) | |||
2478 | } else { | 2231 | } else { |
2479 | if (hw->fw_state == CSIO_DEV_STATE_INIT) { | 2232 | if (hw->fw_state == CSIO_DEV_STATE_INIT) { |
2480 | 2233 | ||
2234 | hw->flags |= CSIO_HWF_USING_SOFT_PARAMS; | ||
2235 | |||
2481 | /* device parameters */ | 2236 | /* device parameters */ |
2482 | rv = csio_get_device_params(hw); | 2237 | rv = csio_get_device_params(hw); |
2483 | if (rv != 0) | 2238 | if (rv != 0) |
@@ -2651,7 +2406,7 @@ csio_hw_intr_disable(struct csio_hw *hw) | |||
2651 | 2406 | ||
2652 | } | 2407 | } |
2653 | 2408 | ||
2654 | static void | 2409 | void |
2655 | csio_hw_fatal_err(struct csio_hw *hw) | 2410 | csio_hw_fatal_err(struct csio_hw *hw) |
2656 | { | 2411 | { |
2657 | csio_set_reg_field(hw, SGE_CONTROL, GLOBALENABLE, 0); | 2412 | csio_set_reg_field(hw, SGE_CONTROL, GLOBALENABLE, 0); |
@@ -2990,14 +2745,6 @@ csio_hws_pcierr(struct csio_hw *hw, enum csio_hw_ev evt) | |||
2990 | /* END: HW SM */ | 2745 | /* END: HW SM */ |
2991 | /*****************************************************************************/ | 2746 | /*****************************************************************************/ |
2992 | 2747 | ||
2993 | /* Slow path handlers */ | ||
2994 | struct intr_info { | ||
2995 | unsigned int mask; /* bits to check in interrupt status */ | ||
2996 | const char *msg; /* message to print or NULL */ | ||
2997 | short stat_idx; /* stat counter to increment or -1 */ | ||
2998 | unsigned short fatal; /* whether the condition reported is fatal */ | ||
2999 | }; | ||
3000 | |||
3001 | /* | 2748 | /* |
3002 | * csio_handle_intr_status - table driven interrupt handler | 2749 | * csio_handle_intr_status - table driven interrupt handler |
3003 | * @hw: HW instance | 2750 | * @hw: HW instance |
@@ -3011,7 +2758,7 @@ struct intr_info { | |||
3011 | * by an entry specifying mask 0. Returns the number of fatal interrupt | 2758 | * by an entry specifying mask 0. Returns the number of fatal interrupt |
3012 | * conditions. | 2759 | * conditions. |
3013 | */ | 2760 | */ |
3014 | static int | 2761 | int |
3015 | csio_handle_intr_status(struct csio_hw *hw, unsigned int reg, | 2762 | csio_handle_intr_status(struct csio_hw *hw, unsigned int reg, |
3016 | const struct intr_info *acts) | 2763 | const struct intr_info *acts) |
3017 | { | 2764 | { |
@@ -3038,80 +2785,6 @@ csio_handle_intr_status(struct csio_hw *hw, unsigned int reg, | |||
3038 | } | 2785 | } |
3039 | 2786 | ||
3040 | /* | 2787 | /* |
3041 | * Interrupt handler for the PCIE module. | ||
3042 | */ | ||
3043 | static void | ||
3044 | csio_pcie_intr_handler(struct csio_hw *hw) | ||
3045 | { | ||
3046 | static struct intr_info sysbus_intr_info[] = { | ||
3047 | { RNPP, "RXNP array parity error", -1, 1 }, | ||
3048 | { RPCP, "RXPC array parity error", -1, 1 }, | ||
3049 | { RCIP, "RXCIF array parity error", -1, 1 }, | ||
3050 | { RCCP, "Rx completions control array parity error", -1, 1 }, | ||
3051 | { RFTP, "RXFT array parity error", -1, 1 }, | ||
3052 | { 0, NULL, 0, 0 } | ||
3053 | }; | ||
3054 | static struct intr_info pcie_port_intr_info[] = { | ||
3055 | { TPCP, "TXPC array parity error", -1, 1 }, | ||
3056 | { TNPP, "TXNP array parity error", -1, 1 }, | ||
3057 | { TFTP, "TXFT array parity error", -1, 1 }, | ||
3058 | { TCAP, "TXCA array parity error", -1, 1 }, | ||
3059 | { TCIP, "TXCIF array parity error", -1, 1 }, | ||
3060 | { RCAP, "RXCA array parity error", -1, 1 }, | ||
3061 | { OTDD, "outbound request TLP discarded", -1, 1 }, | ||
3062 | { RDPE, "Rx data parity error", -1, 1 }, | ||
3063 | { TDUE, "Tx uncorrectable data error", -1, 1 }, | ||
3064 | { 0, NULL, 0, 0 } | ||
3065 | }; | ||
3066 | static struct intr_info pcie_intr_info[] = { | ||
3067 | { MSIADDRLPERR, "MSI AddrL parity error", -1, 1 }, | ||
3068 | { MSIADDRHPERR, "MSI AddrH parity error", -1, 1 }, | ||
3069 | { MSIDATAPERR, "MSI data parity error", -1, 1 }, | ||
3070 | { MSIXADDRLPERR, "MSI-X AddrL parity error", -1, 1 }, | ||
3071 | { MSIXADDRHPERR, "MSI-X AddrH parity error", -1, 1 }, | ||
3072 | { MSIXDATAPERR, "MSI-X data parity error", -1, 1 }, | ||
3073 | { MSIXDIPERR, "MSI-X DI parity error", -1, 1 }, | ||
3074 | { PIOCPLPERR, "PCI PIO completion FIFO parity error", -1, 1 }, | ||
3075 | { PIOREQPERR, "PCI PIO request FIFO parity error", -1, 1 }, | ||
3076 | { TARTAGPERR, "PCI PCI target tag FIFO parity error", -1, 1 }, | ||
3077 | { CCNTPERR, "PCI CMD channel count parity error", -1, 1 }, | ||
3078 | { CREQPERR, "PCI CMD channel request parity error", -1, 1 }, | ||
3079 | { CRSPPERR, "PCI CMD channel response parity error", -1, 1 }, | ||
3080 | { DCNTPERR, "PCI DMA channel count parity error", -1, 1 }, | ||
3081 | { DREQPERR, "PCI DMA channel request parity error", -1, 1 }, | ||
3082 | { DRSPPERR, "PCI DMA channel response parity error", -1, 1 }, | ||
3083 | { HCNTPERR, "PCI HMA channel count parity error", -1, 1 }, | ||
3084 | { HREQPERR, "PCI HMA channel request parity error", -1, 1 }, | ||
3085 | { HRSPPERR, "PCI HMA channel response parity error", -1, 1 }, | ||
3086 | { CFGSNPPERR, "PCI config snoop FIFO parity error", -1, 1 }, | ||
3087 | { FIDPERR, "PCI FID parity error", -1, 1 }, | ||
3088 | { INTXCLRPERR, "PCI INTx clear parity error", -1, 1 }, | ||
3089 | { MATAGPERR, "PCI MA tag parity error", -1, 1 }, | ||
3090 | { PIOTAGPERR, "PCI PIO tag parity error", -1, 1 }, | ||
3091 | { RXCPLPERR, "PCI Rx completion parity error", -1, 1 }, | ||
3092 | { RXWRPERR, "PCI Rx write parity error", -1, 1 }, | ||
3093 | { RPLPERR, "PCI replay buffer parity error", -1, 1 }, | ||
3094 | { PCIESINT, "PCI core secondary fault", -1, 1 }, | ||
3095 | { PCIEPINT, "PCI core primary fault", -1, 1 }, | ||
3096 | { UNXSPLCPLERR, "PCI unexpected split completion error", -1, | ||
3097 | 0 }, | ||
3098 | { 0, NULL, 0, 0 } | ||
3099 | }; | ||
3100 | |||
3101 | int fat; | ||
3102 | |||
3103 | fat = csio_handle_intr_status(hw, | ||
3104 | PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS, | ||
3105 | sysbus_intr_info) + | ||
3106 | csio_handle_intr_status(hw, | ||
3107 | PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS, | ||
3108 | pcie_port_intr_info) + | ||
3109 | csio_handle_intr_status(hw, PCIE_INT_CAUSE, pcie_intr_info); | ||
3110 | if (fat) | ||
3111 | csio_hw_fatal_err(hw); | ||
3112 | } | ||
3113 | |||
3114 | /* | ||
3115 | * TP interrupt handler. | 2788 | * TP interrupt handler. |
3116 | */ | 2789 | */ |
3117 | static void csio_tp_intr_handler(struct csio_hw *hw) | 2790 | static void csio_tp_intr_handler(struct csio_hw *hw) |
@@ -3517,7 +3190,7 @@ static void csio_ncsi_intr_handler(struct csio_hw *hw) | |||
3517 | */ | 3190 | */ |
3518 | static void csio_xgmac_intr_handler(struct csio_hw *hw, int port) | 3191 | static void csio_xgmac_intr_handler(struct csio_hw *hw, int port) |
3519 | { | 3192 | { |
3520 | uint32_t v = csio_rd_reg32(hw, PORT_REG(port, XGMAC_PORT_INT_CAUSE)); | 3193 | uint32_t v = csio_rd_reg32(hw, CSIO_MAC_INT_CAUSE_REG(hw, port)); |
3521 | 3194 | ||
3522 | v &= TXFIFO_PRTY_ERR | RXFIFO_PRTY_ERR; | 3195 | v &= TXFIFO_PRTY_ERR | RXFIFO_PRTY_ERR; |
3523 | if (!v) | 3196 | if (!v) |
@@ -3527,7 +3200,7 @@ static void csio_xgmac_intr_handler(struct csio_hw *hw, int port) | |||
3527 | csio_fatal(hw, "XGMAC %d Tx FIFO parity error\n", port); | 3200 | csio_fatal(hw, "XGMAC %d Tx FIFO parity error\n", port); |
3528 | if (v & RXFIFO_PRTY_ERR) | 3201 | if (v & RXFIFO_PRTY_ERR) |
3529 | csio_fatal(hw, "XGMAC %d Rx FIFO parity error\n", port); | 3202 | csio_fatal(hw, "XGMAC %d Rx FIFO parity error\n", port); |
3530 | csio_wr_reg32(hw, v, PORT_REG(port, XGMAC_PORT_INT_CAUSE)); | 3203 | csio_wr_reg32(hw, v, CSIO_MAC_INT_CAUSE_REG(hw, port)); |
3531 | csio_hw_fatal_err(hw); | 3204 | csio_hw_fatal_err(hw); |
3532 | } | 3205 | } |
3533 | 3206 | ||
@@ -3596,7 +3269,7 @@ csio_hw_slow_intr_handler(struct csio_hw *hw) | |||
3596 | csio_xgmac_intr_handler(hw, 3); | 3269 | csio_xgmac_intr_handler(hw, 3); |
3597 | 3270 | ||
3598 | if (cause & PCIE) | 3271 | if (cause & PCIE) |
3599 | csio_pcie_intr_handler(hw); | 3272 | hw->chip_ops->chip_pcie_intr_handler(hw); |
3600 | 3273 | ||
3601 | if (cause & MC) | 3274 | if (cause & MC) |
3602 | csio_mem_intr_handler(hw, MEM_MC); | 3275 | csio_mem_intr_handler(hw, MEM_MC); |
@@ -4262,6 +3935,7 @@ csio_hw_get_device_id(struct csio_hw *hw) | |||
4262 | &hw->params.pci.device_id); | 3935 | &hw->params.pci.device_id); |
4263 | 3936 | ||
4264 | csio_dev_id_cached(hw); | 3937 | csio_dev_id_cached(hw); |
3938 | hw->chip_id = (hw->params.pci.device_id & CSIO_HW_CHIP_MASK); | ||
4265 | 3939 | ||
4266 | } /* csio_hw_get_device_id */ | 3940 | } /* csio_hw_get_device_id */ |
4267 | 3941 | ||
@@ -4280,19 +3954,21 @@ csio_hw_set_description(struct csio_hw *hw, uint16_t ven_id, uint16_t dev_id) | |||
4280 | prot_type = (dev_id & CSIO_ASIC_DEVID_PROTO_MASK); | 3954 | prot_type = (dev_id & CSIO_ASIC_DEVID_PROTO_MASK); |
4281 | adap_type = (dev_id & CSIO_ASIC_DEVID_TYPE_MASK); | 3955 | adap_type = (dev_id & CSIO_ASIC_DEVID_TYPE_MASK); |
4282 | 3956 | ||
4283 | if (prot_type == CSIO_FPGA) { | 3957 | if (prot_type == CSIO_T4_FCOE_ASIC) { |
3958 | memcpy(hw->hw_ver, | ||
3959 | csio_t4_fcoe_adapters[adap_type].model_no, 16); | ||
4284 | memcpy(hw->model_desc, | 3960 | memcpy(hw->model_desc, |
4285 | csio_fcoe_adapters[13].description, 32); | 3961 | csio_t4_fcoe_adapters[adap_type].description, |
4286 | } else if (prot_type == CSIO_T4_FCOE_ASIC) { | 3962 | 32); |
3963 | } else if (prot_type == CSIO_T5_FCOE_ASIC) { | ||
4287 | memcpy(hw->hw_ver, | 3964 | memcpy(hw->hw_ver, |
4288 | csio_fcoe_adapters[adap_type].model_no, 16); | 3965 | csio_t5_fcoe_adapters[adap_type].model_no, 16); |
4289 | memcpy(hw->model_desc, | 3966 | memcpy(hw->model_desc, |
4290 | csio_fcoe_adapters[adap_type].description, 32); | 3967 | csio_t5_fcoe_adapters[adap_type].description, |
3968 | 32); | ||
4291 | } else { | 3969 | } else { |
4292 | char tempName[32] = "Chelsio FCoE Controller"; | 3970 | char tempName[32] = "Chelsio FCoE Controller"; |
4293 | memcpy(hw->model_desc, tempName, 32); | 3971 | memcpy(hw->model_desc, tempName, 32); |
4294 | |||
4295 | CSIO_DB_ASSERT(0); | ||
4296 | } | 3972 | } |
4297 | } | 3973 | } |
4298 | } /* csio_hw_set_description */ | 3974 | } /* csio_hw_set_description */ |
@@ -4321,6 +3997,9 @@ csio_hw_init(struct csio_hw *hw) | |||
4321 | 3997 | ||
4322 | strcpy(hw->name, CSIO_HW_NAME); | 3998 | strcpy(hw->name, CSIO_HW_NAME); |
4323 | 3999 | ||
4000 | /* Initialize the HW chip ops with T4/T5 specific ops */ | ||
4001 | hw->chip_ops = csio_is_t4(hw->chip_id) ? &t4_ops : &t5_ops; | ||
4002 | |||
4324 | /* Set the model & its description */ | 4003 | /* Set the model & its description */ |
4325 | 4004 | ||
4326 | ven_id = hw->params.pci.vendor_id; | 4005 | ven_id = hw->params.pci.vendor_id; |
diff --git a/drivers/scsi/csiostor/csio_hw.h b/drivers/scsi/csiostor/csio_hw.h index 9edcca4c71af..489fc095cb03 100644 --- a/drivers/scsi/csiostor/csio_hw.h +++ b/drivers/scsi/csiostor/csio_hw.h | |||
@@ -48,6 +48,7 @@ | |||
48 | #include <scsi/scsi_device.h> | 48 | #include <scsi/scsi_device.h> |
49 | #include <scsi/scsi_transport_fc.h> | 49 | #include <scsi/scsi_transport_fc.h> |
50 | 50 | ||
51 | #include "csio_hw_chip.h" | ||
51 | #include "csio_wr.h" | 52 | #include "csio_wr.h" |
52 | #include "csio_mb.h" | 53 | #include "csio_mb.h" |
53 | #include "csio_scsi.h" | 54 | #include "csio_scsi.h" |
@@ -60,13 +61,6 @@ | |||
60 | */ | 61 | */ |
61 | #define FW_HOSTERROR 255 | 62 | #define FW_HOSTERROR 255 |
62 | 63 | ||
63 | #define CSIO_FW_FNAME "cxgb4/t4fw.bin" | ||
64 | #define CSIO_CF_FNAME "cxgb4/t4-config.txt" | ||
65 | |||
66 | #define FW_VERSION_MAJOR 1 | ||
67 | #define FW_VERSION_MINOR 2 | ||
68 | #define FW_VERSION_MICRO 8 | ||
69 | |||
70 | #define CSIO_HW_NAME "Chelsio FCoE Adapter" | 64 | #define CSIO_HW_NAME "Chelsio FCoE Adapter" |
71 | #define CSIO_MAX_PFN 8 | 65 | #define CSIO_MAX_PFN 8 |
72 | #define CSIO_MAX_PPORTS 4 | 66 | #define CSIO_MAX_PPORTS 4 |
@@ -123,8 +117,6 @@ extern int csio_msi; | |||
123 | #define CSIO_VENDOR_ID 0x1425 | 117 | #define CSIO_VENDOR_ID 0x1425 |
124 | #define CSIO_ASIC_DEVID_PROTO_MASK 0xFF00 | 118 | #define CSIO_ASIC_DEVID_PROTO_MASK 0xFF00 |
125 | #define CSIO_ASIC_DEVID_TYPE_MASK 0x00FF | 119 | #define CSIO_ASIC_DEVID_TYPE_MASK 0x00FF |
126 | #define CSIO_FPGA 0xA000 | ||
127 | #define CSIO_T4_FCOE_ASIC 0x4600 | ||
128 | 120 | ||
129 | #define CSIO_GLBL_INTR_MASK (CIM | MPS | PL | PCIE | MC | EDC0 | \ | 121 | #define CSIO_GLBL_INTR_MASK (CIM | MPS | PL | PCIE | MC | EDC0 | \ |
130 | EDC1 | LE | TP | MA | PM_TX | PM_RX | \ | 122 | EDC1 | LE | TP | MA | PM_TX | PM_RX | \ |
@@ -207,17 +199,6 @@ enum { | |||
207 | SF_SIZE = SF_SEC_SIZE * 16, /* serial flash size */ | 199 | SF_SIZE = SF_SEC_SIZE * 16, /* serial flash size */ |
208 | }; | 200 | }; |
209 | 201 | ||
210 | enum { MEM_EDC0, MEM_EDC1, MEM_MC }; | ||
211 | |||
212 | enum { | ||
213 | MEMWIN0_APERTURE = 2048, | ||
214 | MEMWIN0_BASE = 0x1b800, | ||
215 | MEMWIN1_APERTURE = 32768, | ||
216 | MEMWIN1_BASE = 0x28000, | ||
217 | MEMWIN2_APERTURE = 65536, | ||
218 | MEMWIN2_BASE = 0x30000, | ||
219 | }; | ||
220 | |||
221 | /* serial flash and firmware constants */ | 202 | /* serial flash and firmware constants */ |
222 | enum { | 203 | enum { |
223 | SF_ATTEMPTS = 10, /* max retries for SF operations */ | 204 | SF_ATTEMPTS = 10, /* max retries for SF operations */ |
@@ -239,9 +220,6 @@ enum { | |||
239 | FLASH_CFG_MAX_SIZE = 0x10000 , /* max size of the flash config file*/ | 220 | FLASH_CFG_MAX_SIZE = 0x10000 , /* max size of the flash config file*/ |
240 | FLASH_CFG_OFFSET = 0x1f0000, | 221 | FLASH_CFG_OFFSET = 0x1f0000, |
241 | FLASH_CFG_START_SEC = FLASH_CFG_OFFSET / SF_SEC_SIZE, | 222 | FLASH_CFG_START_SEC = FLASH_CFG_OFFSET / SF_SEC_SIZE, |
242 | FPGA_FLASH_CFG_OFFSET = 0xf0000 , /* if FPGA mode, then cfg file is | ||
243 | * at 1MB - 64KB */ | ||
244 | FPGA_FLASH_CFG_START_SEC = FPGA_FLASH_CFG_OFFSET / SF_SEC_SIZE, | ||
245 | }; | 223 | }; |
246 | 224 | ||
247 | /* | 225 | /* |
@@ -259,6 +237,8 @@ enum { | |||
259 | FLASH_FW_START = FLASH_START(FLASH_FW_START_SEC), | 237 | FLASH_FW_START = FLASH_START(FLASH_FW_START_SEC), |
260 | FLASH_FW_MAX_SIZE = FLASH_MAX_SIZE(FLASH_FW_NSECS), | 238 | FLASH_FW_MAX_SIZE = FLASH_MAX_SIZE(FLASH_FW_NSECS), |
261 | 239 | ||
240 | /* Location of Firmware Configuration File in FLASH. */ | ||
241 | FLASH_CFG_START = FLASH_START(FLASH_CFG_START_SEC), | ||
262 | }; | 242 | }; |
263 | 243 | ||
264 | #undef FLASH_START | 244 | #undef FLASH_START |
@@ -310,7 +290,7 @@ struct csio_adap_desc { | |||
310 | struct pci_params { | 290 | struct pci_params { |
311 | uint16_t vendor_id; | 291 | uint16_t vendor_id; |
312 | uint16_t device_id; | 292 | uint16_t device_id; |
313 | uint32_t vpd_cap_addr; | 293 | int vpd_cap_addr; |
314 | uint16_t speed; | 294 | uint16_t speed; |
315 | uint8_t width; | 295 | uint8_t width; |
316 | }; | 296 | }; |
@@ -513,6 +493,7 @@ struct csio_hw { | |||
513 | uint32_t fwrev; | 493 | uint32_t fwrev; |
514 | uint32_t tp_vers; | 494 | uint32_t tp_vers; |
515 | char chip_ver; | 495 | char chip_ver; |
496 | uint16_t chip_id; /* Tells T4/T5 chip */ | ||
516 | uint32_t cfg_finiver; | 497 | uint32_t cfg_finiver; |
517 | uint32_t cfg_finicsum; | 498 | uint32_t cfg_finicsum; |
518 | uint32_t cfg_cfcsum; | 499 | uint32_t cfg_cfcsum; |
@@ -556,6 +537,9 @@ struct csio_hw { | |||
556 | */ | 537 | */ |
557 | 538 | ||
558 | struct csio_fcoe_res_info fres_info; /* Fcoe resource info */ | 539 | struct csio_fcoe_res_info fres_info; /* Fcoe resource info */ |
540 | struct csio_hw_chip_ops *chip_ops; /* T4/T5 Chip specific | ||
541 | * Operations | ||
542 | */ | ||
559 | 543 | ||
560 | /* MSIX vectors */ | 544 | /* MSIX vectors */ |
561 | struct csio_msix_entries msix_entries[CSIO_MAX_MSIX_VECS]; | 545 | struct csio_msix_entries msix_entries[CSIO_MAX_MSIX_VECS]; |
@@ -636,9 +620,16 @@ csio_us_to_core_ticks(struct csio_hw *hw, uint32_t us) | |||
636 | #define csio_dbg(__hw, __fmt, ...) | 620 | #define csio_dbg(__hw, __fmt, ...) |
637 | #endif | 621 | #endif |
638 | 622 | ||
623 | int csio_hw_wait_op_done_val(struct csio_hw *, int, uint32_t, int, | ||
624 | int, int, uint32_t *); | ||
625 | void csio_hw_tp_wr_bits_indirect(struct csio_hw *, unsigned int, | ||
626 | unsigned int, unsigned int); | ||
639 | int csio_mgmt_req_lookup(struct csio_mgmtm *, struct csio_ioreq *); | 627 | int csio_mgmt_req_lookup(struct csio_mgmtm *, struct csio_ioreq *); |
640 | void csio_hw_intr_disable(struct csio_hw *); | 628 | void csio_hw_intr_disable(struct csio_hw *); |
641 | int csio_hw_slow_intr_handler(struct csio_hw *hw); | 629 | int csio_hw_slow_intr_handler(struct csio_hw *); |
630 | int csio_handle_intr_status(struct csio_hw *, unsigned int, | ||
631 | const struct intr_info *); | ||
632 | |||
642 | int csio_hw_start(struct csio_hw *); | 633 | int csio_hw_start(struct csio_hw *); |
643 | int csio_hw_stop(struct csio_hw *); | 634 | int csio_hw_stop(struct csio_hw *); |
644 | int csio_hw_reset(struct csio_hw *); | 635 | int csio_hw_reset(struct csio_hw *); |
@@ -647,19 +638,17 @@ int csio_is_hw_removing(struct csio_hw *); | |||
647 | 638 | ||
648 | int csio_fwevtq_handler(struct csio_hw *); | 639 | int csio_fwevtq_handler(struct csio_hw *); |
649 | void csio_evtq_worker(struct work_struct *); | 640 | void csio_evtq_worker(struct work_struct *); |
650 | int csio_enqueue_evt(struct csio_hw *hw, enum csio_evt type, | 641 | int csio_enqueue_evt(struct csio_hw *, enum csio_evt, void *, uint16_t); |
651 | void *evt_msg, uint16_t len); | ||
652 | void csio_evtq_flush(struct csio_hw *hw); | 642 | void csio_evtq_flush(struct csio_hw *hw); |
653 | 643 | ||
654 | int csio_request_irqs(struct csio_hw *); | 644 | int csio_request_irqs(struct csio_hw *); |
655 | void csio_intr_enable(struct csio_hw *); | 645 | void csio_intr_enable(struct csio_hw *); |
656 | void csio_intr_disable(struct csio_hw *, bool); | 646 | void csio_intr_disable(struct csio_hw *, bool); |
647 | void csio_hw_fatal_err(struct csio_hw *); | ||
657 | 648 | ||
658 | struct csio_lnode *csio_lnode_alloc(struct csio_hw *); | 649 | struct csio_lnode *csio_lnode_alloc(struct csio_hw *); |
659 | int csio_config_queues(struct csio_hw *); | 650 | int csio_config_queues(struct csio_hw *); |
660 | 651 | ||
661 | int csio_hw_mc_read(struct csio_hw *, uint32_t, __be32 *, uint64_t *); | ||
662 | int csio_hw_edc_read(struct csio_hw *, int, uint32_t, __be32 *, uint64_t *); | ||
663 | int csio_hw_init(struct csio_hw *); | 652 | int csio_hw_init(struct csio_hw *); |
664 | void csio_hw_exit(struct csio_hw *); | 653 | void csio_hw_exit(struct csio_hw *); |
665 | #endif /* ifndef __CSIO_HW_H__ */ | 654 | #endif /* ifndef __CSIO_HW_H__ */ |
diff --git a/drivers/scsi/csiostor/csio_init.c b/drivers/scsi/csiostor/csio_init.c index 0604b5ff3638..00346fe939d5 100644 --- a/drivers/scsi/csiostor/csio_init.c +++ b/drivers/scsi/csiostor/csio_init.c | |||
@@ -81,9 +81,11 @@ csio_mem_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) | |||
81 | __be32 data[16]; | 81 | __be32 data[16]; |
82 | 82 | ||
83 | if (mem == MEM_MC) | 83 | if (mem == MEM_MC) |
84 | ret = csio_hw_mc_read(hw, pos, data, NULL); | 84 | ret = hw->chip_ops->chip_mc_read(hw, 0, pos, |
85 | data, NULL); | ||
85 | else | 86 | else |
86 | ret = csio_hw_edc_read(hw, mem, pos, data, NULL); | 87 | ret = hw->chip_ops->chip_edc_read(hw, mem, pos, |
88 | data, NULL); | ||
87 | if (ret) | 89 | if (ret) |
88 | return ret; | 90 | return ret; |
89 | 91 | ||
@@ -108,7 +110,7 @@ static const struct file_operations csio_mem_debugfs_fops = { | |||
108 | .llseek = default_llseek, | 110 | .llseek = default_llseek, |
109 | }; | 111 | }; |
110 | 112 | ||
111 | static void csio_add_debugfs_mem(struct csio_hw *hw, const char *name, | 113 | void csio_add_debugfs_mem(struct csio_hw *hw, const char *name, |
112 | unsigned int idx, unsigned int size_mb) | 114 | unsigned int idx, unsigned int size_mb) |
113 | { | 115 | { |
114 | struct dentry *de; | 116 | struct dentry *de; |
@@ -131,9 +133,8 @@ static int csio_setup_debugfs(struct csio_hw *hw) | |||
131 | csio_add_debugfs_mem(hw, "edc0", MEM_EDC0, 5); | 133 | csio_add_debugfs_mem(hw, "edc0", MEM_EDC0, 5); |
132 | if (i & EDRAM1_ENABLE) | 134 | if (i & EDRAM1_ENABLE) |
133 | csio_add_debugfs_mem(hw, "edc1", MEM_EDC1, 5); | 135 | csio_add_debugfs_mem(hw, "edc1", MEM_EDC1, 5); |
134 | if (i & EXT_MEM_ENABLE) | 136 | |
135 | csio_add_debugfs_mem(hw, "mc", MEM_MC, | 137 | hw->chip_ops->chip_dfs_create_ext_mem(hw); |
136 | EXT_MEM_SIZE_GET(csio_rd_reg32(hw, MA_EXT_MEMORY_BAR))); | ||
137 | return 0; | 138 | return 0; |
138 | } | 139 | } |
139 | 140 | ||
@@ -1169,7 +1170,7 @@ static struct pci_error_handlers csio_err_handler = { | |||
1169 | }; | 1170 | }; |
1170 | 1171 | ||
1171 | static DEFINE_PCI_DEVICE_TABLE(csio_pci_tbl) = { | 1172 | static DEFINE_PCI_DEVICE_TABLE(csio_pci_tbl) = { |
1172 | CSIO_DEVICE(CSIO_DEVID_T440DBG_FCOE, 0), /* T440DBG FCOE */ | 1173 | CSIO_DEVICE(CSIO_DEVID_T440DBG_FCOE, 0), /* T4 DEBUG FCOE */ |
1173 | CSIO_DEVICE(CSIO_DEVID_T420CR_FCOE, 0), /* T420CR FCOE */ | 1174 | CSIO_DEVICE(CSIO_DEVID_T420CR_FCOE, 0), /* T420CR FCOE */ |
1174 | CSIO_DEVICE(CSIO_DEVID_T422CR_FCOE, 0), /* T422CR FCOE */ | 1175 | CSIO_DEVICE(CSIO_DEVID_T422CR_FCOE, 0), /* T422CR FCOE */ |
1175 | CSIO_DEVICE(CSIO_DEVID_T440CR_FCOE, 0), /* T440CR FCOE */ | 1176 | CSIO_DEVICE(CSIO_DEVID_T440CR_FCOE, 0), /* T440CR FCOE */ |
@@ -1184,8 +1185,34 @@ static DEFINE_PCI_DEVICE_TABLE(csio_pci_tbl) = { | |||
1184 | CSIO_DEVICE(CSIO_DEVID_B404_FCOE, 0), /* B404 FCOE */ | 1185 | CSIO_DEVICE(CSIO_DEVID_B404_FCOE, 0), /* B404 FCOE */ |
1185 | CSIO_DEVICE(CSIO_DEVID_T480CR_FCOE, 0), /* T480 CR FCOE */ | 1186 | CSIO_DEVICE(CSIO_DEVID_T480CR_FCOE, 0), /* T480 CR FCOE */ |
1186 | CSIO_DEVICE(CSIO_DEVID_T440LPCR_FCOE, 0), /* T440 LP-CR FCOE */ | 1187 | CSIO_DEVICE(CSIO_DEVID_T440LPCR_FCOE, 0), /* T440 LP-CR FCOE */ |
1187 | CSIO_DEVICE(CSIO_DEVID_PE10K, 0), /* PE10K FCOE */ | 1188 | CSIO_DEVICE(CSIO_DEVID_AMSTERDAM_T4_FCOE, 0), /* AMSTERDAM T4 FCOE */ |
1188 | CSIO_DEVICE(CSIO_DEVID_PE10K_PF1, 0), /* PE10K FCOE on PF1 */ | 1189 | CSIO_DEVICE(CSIO_DEVID_HUAWEI_T480_FCOE, 0), /* HUAWEI T480 FCOE */ |
1190 | CSIO_DEVICE(CSIO_DEVID_HUAWEI_T440_FCOE, 0), /* HUAWEI T440 FCOE */ | ||
1191 | CSIO_DEVICE(CSIO_DEVID_HUAWEI_STG310_FCOE, 0), /* HUAWEI STG FCOE */ | ||
1192 | CSIO_DEVICE(CSIO_DEVID_ACROMAG_XMC_XAUI, 0), /* ACROMAG XAUI FCOE */ | ||
1193 | CSIO_DEVICE(CSIO_DEVID_QUANTA_MEZZ_SFP_FCOE, 0),/* QUANTA MEZZ FCOE */ | ||
1194 | CSIO_DEVICE(CSIO_DEVID_HUAWEI_10GT_FCOE, 0), /* HUAWEI 10GT FCOE */ | ||
1195 | CSIO_DEVICE(CSIO_DEVID_HUAWEI_T440_TOE_FCOE, 0),/* HUAWEI T4 TOE FCOE */ | ||
1196 | CSIO_DEVICE(CSIO_DEVID_T580DBG_FCOE, 0), /* T5 DEBUG FCOE */ | ||
1197 | CSIO_DEVICE(CSIO_DEVID_T520CR_FCOE, 0), /* T520CR FCOE */ | ||
1198 | CSIO_DEVICE(CSIO_DEVID_T522CR_FCOE, 0), /* T522CR FCOE */ | ||
1199 | CSIO_DEVICE(CSIO_DEVID_T540CR_FCOE, 0), /* T540CR FCOE */ | ||
1200 | CSIO_DEVICE(CSIO_DEVID_T520BCH_FCOE, 0), /* T520BCH FCOE */ | ||
1201 | CSIO_DEVICE(CSIO_DEVID_T540BCH_FCOE, 0), /* T540BCH FCOE */ | ||
1202 | CSIO_DEVICE(CSIO_DEVID_T540CH_FCOE, 0), /* T540CH FCOE */ | ||
1203 | CSIO_DEVICE(CSIO_DEVID_T520SO_FCOE, 0), /* T520SO FCOE */ | ||
1204 | CSIO_DEVICE(CSIO_DEVID_T520CX_FCOE, 0), /* T520CX FCOE */ | ||
1205 | CSIO_DEVICE(CSIO_DEVID_T520BT_FCOE, 0), /* T520BT FCOE */ | ||
1206 | CSIO_DEVICE(CSIO_DEVID_T504BT_FCOE, 0), /* T504BT FCOE */ | ||
1207 | CSIO_DEVICE(CSIO_DEVID_B520_FCOE, 0), /* B520 FCOE */ | ||
1208 | CSIO_DEVICE(CSIO_DEVID_B504_FCOE, 0), /* B504 FCOE */ | ||
1209 | CSIO_DEVICE(CSIO_DEVID_T580CR2_FCOE, 0), /* T580 CR FCOE */ | ||
1210 | CSIO_DEVICE(CSIO_DEVID_T540LPCR_FCOE, 0), /* T540 LP-CR FCOE */ | ||
1211 | CSIO_DEVICE(CSIO_DEVID_AMSTERDAM_T5_FCOE, 0), /* AMSTERDAM T5 FCOE */ | ||
1212 | CSIO_DEVICE(CSIO_DEVID_T580LPCR_FCOE, 0), /* T580 LP-CR FCOE */ | ||
1213 | CSIO_DEVICE(CSIO_DEVID_T520LLCR_FCOE, 0), /* T520 LL-CR FCOE */ | ||
1214 | CSIO_DEVICE(CSIO_DEVID_T560CR_FCOE, 0), /* T560 CR FCOE */ | ||
1215 | CSIO_DEVICE(CSIO_DEVID_T580CR_FCOE, 0), /* T580 CR FCOE */ | ||
1189 | { 0, 0, 0, 0, 0, 0, 0 } | 1216 | { 0, 0, 0, 0, 0, 0, 0 } |
1190 | }; | 1217 | }; |
1191 | 1218 | ||
@@ -1259,4 +1286,5 @@ MODULE_DESCRIPTION(CSIO_DRV_DESC); | |||
1259 | MODULE_LICENSE(CSIO_DRV_LICENSE); | 1286 | MODULE_LICENSE(CSIO_DRV_LICENSE); |
1260 | MODULE_DEVICE_TABLE(pci, csio_pci_tbl); | 1287 | MODULE_DEVICE_TABLE(pci, csio_pci_tbl); |
1261 | MODULE_VERSION(CSIO_DRV_VERSION); | 1288 | MODULE_VERSION(CSIO_DRV_VERSION); |
1262 | MODULE_FIRMWARE(CSIO_FW_FNAME); | 1289 | MODULE_FIRMWARE(FW_FNAME_T4); |
1290 | MODULE_FIRMWARE(FW_FNAME_T5); | ||
diff --git a/drivers/scsi/csiostor/csio_init.h b/drivers/scsi/csiostor/csio_init.h index 0838fd7ec9c7..5cc5d317a442 100644 --- a/drivers/scsi/csiostor/csio_init.h +++ b/drivers/scsi/csiostor/csio_init.h | |||
@@ -52,31 +52,6 @@ | |||
52 | #define CSIO_DRV_DESC "Chelsio FCoE driver" | 52 | #define CSIO_DRV_DESC "Chelsio FCoE driver" |
53 | #define CSIO_DRV_VERSION "1.0.0" | 53 | #define CSIO_DRV_VERSION "1.0.0" |
54 | 54 | ||
55 | #define CSIO_DEVICE(devid, idx) \ | ||
56 | { PCI_VENDOR_ID_CHELSIO, (devid), PCI_ANY_ID, PCI_ANY_ID, 0, 0, (idx) } | ||
57 | |||
58 | #define CSIO_IS_T4_FPGA(_dev) (((_dev) == CSIO_DEVID_PE10K) ||\ | ||
59 | ((_dev) == CSIO_DEVID_PE10K_PF1)) | ||
60 | |||
61 | /* FCoE device IDs */ | ||
62 | #define CSIO_DEVID_PE10K 0xA000 | ||
63 | #define CSIO_DEVID_PE10K_PF1 0xA001 | ||
64 | #define CSIO_DEVID_T440DBG_FCOE 0x4600 | ||
65 | #define CSIO_DEVID_T420CR_FCOE 0x4601 | ||
66 | #define CSIO_DEVID_T422CR_FCOE 0x4602 | ||
67 | #define CSIO_DEVID_T440CR_FCOE 0x4603 | ||
68 | #define CSIO_DEVID_T420BCH_FCOE 0x4604 | ||
69 | #define CSIO_DEVID_T440BCH_FCOE 0x4605 | ||
70 | #define CSIO_DEVID_T440CH_FCOE 0x4606 | ||
71 | #define CSIO_DEVID_T420SO_FCOE 0x4607 | ||
72 | #define CSIO_DEVID_T420CX_FCOE 0x4608 | ||
73 | #define CSIO_DEVID_T420BT_FCOE 0x4609 | ||
74 | #define CSIO_DEVID_T404BT_FCOE 0x460A | ||
75 | #define CSIO_DEVID_B420_FCOE 0x460B | ||
76 | #define CSIO_DEVID_B404_FCOE 0x460C | ||
77 | #define CSIO_DEVID_T480CR_FCOE 0x460D | ||
78 | #define CSIO_DEVID_T440LPCR_FCOE 0x460E | ||
79 | |||
80 | extern struct fc_function_template csio_fc_transport_funcs; | 55 | extern struct fc_function_template csio_fc_transport_funcs; |
81 | extern struct fc_function_template csio_fc_transport_vport_funcs; | 56 | extern struct fc_function_template csio_fc_transport_vport_funcs; |
82 | 57 | ||
@@ -100,6 +75,10 @@ struct csio_lnode *csio_shost_init(struct csio_hw *, struct device *, bool, | |||
100 | void csio_shost_exit(struct csio_lnode *); | 75 | void csio_shost_exit(struct csio_lnode *); |
101 | void csio_lnodes_exit(struct csio_hw *, bool); | 76 | void csio_lnodes_exit(struct csio_hw *, bool); |
102 | 77 | ||
78 | /* DebugFS helper routines */ | ||
79 | void csio_add_debugfs_mem(struct csio_hw *, const char *, | ||
80 | unsigned int, unsigned int); | ||
81 | |||
103 | static inline struct Scsi_Host * | 82 | static inline struct Scsi_Host * |
104 | csio_ln_to_shost(struct csio_lnode *ln) | 83 | csio_ln_to_shost(struct csio_lnode *ln) |
105 | { | 84 | { |
diff --git a/drivers/scsi/csiostor/csio_wr.c b/drivers/scsi/csiostor/csio_wr.c index 713e77d12cb4..4255ce264abf 100644 --- a/drivers/scsi/csiostor/csio_wr.c +++ b/drivers/scsi/csiostor/csio_wr.c | |||
@@ -85,8 +85,8 @@ csio_wr_ring_fldb(struct csio_hw *hw, struct csio_q *flq) | |||
85 | */ | 85 | */ |
86 | if (flq->inc_idx >= 8) { | 86 | if (flq->inc_idx >= 8) { |
87 | csio_wr_reg32(hw, DBPRIO(1) | QID(flq->un.fl.flid) | | 87 | csio_wr_reg32(hw, DBPRIO(1) | QID(flq->un.fl.flid) | |
88 | PIDX(flq->inc_idx / 8), | 88 | CSIO_HW_PIDX(hw, flq->inc_idx / 8), |
89 | MYPF_REG(SGE_PF_KDOORBELL)); | 89 | MYPF_REG(SGE_PF_KDOORBELL)); |
90 | flq->inc_idx &= 7; | 90 | flq->inc_idx &= 7; |
91 | } | 91 | } |
92 | } | 92 | } |
@@ -989,7 +989,8 @@ csio_wr_issue(struct csio_hw *hw, int qidx, bool prio) | |||
989 | wmb(); | 989 | wmb(); |
990 | /* Ring SGE Doorbell writing q->pidx into it */ | 990 | /* Ring SGE Doorbell writing q->pidx into it */ |
991 | csio_wr_reg32(hw, DBPRIO(prio) | QID(q->un.eq.physeqid) | | 991 | csio_wr_reg32(hw, DBPRIO(prio) | QID(q->un.eq.physeqid) | |
992 | PIDX(q->inc_idx), MYPF_REG(SGE_PF_KDOORBELL)); | 992 | CSIO_HW_PIDX(hw, q->inc_idx), |
993 | MYPF_REG(SGE_PF_KDOORBELL)); | ||
993 | q->inc_idx = 0; | 994 | q->inc_idx = 0; |
994 | 995 | ||
995 | return 0; | 996 | return 0; |
@@ -1352,6 +1353,9 @@ csio_wr_fixup_host_params(struct csio_hw *hw) | |||
1352 | /* default value of rx_dma_offset of the NIC driver */ | 1353 | /* default value of rx_dma_offset of the NIC driver */ |
1353 | csio_set_reg_field(hw, SGE_CONTROL, PKTSHIFT_MASK, | 1354 | csio_set_reg_field(hw, SGE_CONTROL, PKTSHIFT_MASK, |
1354 | PKTSHIFT(CSIO_SGE_RX_DMA_OFFSET)); | 1355 | PKTSHIFT(CSIO_SGE_RX_DMA_OFFSET)); |
1356 | |||
1357 | csio_hw_tp_wr_bits_indirect(hw, TP_INGRESS_CONFIG, | ||
1358 | CSUM_HAS_PSEUDO_HDR, 0); | ||
1355 | } | 1359 | } |
1356 | 1360 | ||
1357 | static void | 1361 | static void |
@@ -1467,10 +1471,11 @@ csio_wr_set_sge(struct csio_hw *hw) | |||
1467 | * and generate an interrupt when this occurs so we can recover. | 1471 | * and generate an interrupt when this occurs so we can recover. |
1468 | */ | 1472 | */ |
1469 | csio_set_reg_field(hw, SGE_DBFIFO_STATUS, | 1473 | csio_set_reg_field(hw, SGE_DBFIFO_STATUS, |
1470 | HP_INT_THRESH(HP_INT_THRESH_MASK) | | 1474 | HP_INT_THRESH(HP_INT_THRESH_MASK) | |
1471 | LP_INT_THRESH(LP_INT_THRESH_MASK), | 1475 | CSIO_HW_LP_INT_THRESH(hw, CSIO_HW_M_LP_INT_THRESH(hw)), |
1472 | HP_INT_THRESH(CSIO_SGE_DBFIFO_INT_THRESH) | | 1476 | HP_INT_THRESH(CSIO_SGE_DBFIFO_INT_THRESH) | |
1473 | LP_INT_THRESH(CSIO_SGE_DBFIFO_INT_THRESH)); | 1477 | CSIO_HW_LP_INT_THRESH(hw, CSIO_SGE_DBFIFO_INT_THRESH)); |
1478 | |||
1474 | csio_set_reg_field(hw, SGE_DOORBELL_CONTROL, ENABLE_DROP, | 1479 | csio_set_reg_field(hw, SGE_DOORBELL_CONTROL, ENABLE_DROP, |
1475 | ENABLE_DROP); | 1480 | ENABLE_DROP); |
1476 | 1481 | ||