diff options
Diffstat (limited to 'drivers/scsi')
173 files changed, 2263 insertions, 1216 deletions
diff --git a/drivers/scsi/3w-9xxx.h b/drivers/scsi/3w-9xxx.h index 3343824855d0..040f7214e5b7 100644 --- a/drivers/scsi/3w-9xxx.h +++ b/drivers/scsi/3w-9xxx.h | |||
@@ -61,7 +61,7 @@ static twa_message_type twa_aen_table[] = { | |||
61 | {0x0000, "AEN queue empty"}, | 61 | {0x0000, "AEN queue empty"}, |
62 | {0x0001, "Controller reset occurred"}, | 62 | {0x0001, "Controller reset occurred"}, |
63 | {0x0002, "Degraded unit detected"}, | 63 | {0x0002, "Degraded unit detected"}, |
64 | {0x0003, "Controller error occured"}, | 64 | {0x0003, "Controller error occurred"}, |
65 | {0x0004, "Background rebuild failed"}, | 65 | {0x0004, "Background rebuild failed"}, |
66 | {0x0005, "Background rebuild done"}, | 66 | {0x0005, "Background rebuild done"}, |
67 | {0x0006, "Incomplete unit detected"}, | 67 | {0x0006, "Incomplete unit detected"}, |
diff --git a/drivers/scsi/3w-xxxx.h b/drivers/scsi/3w-xxxx.h index 8b9f9d17e7fe..49dcf03c631a 100644 --- a/drivers/scsi/3w-xxxx.h +++ b/drivers/scsi/3w-xxxx.h | |||
@@ -8,7 +8,7 @@ | |||
8 | 8 | ||
9 | Copyright (C) 1999-2010 3ware Inc. | 9 | Copyright (C) 1999-2010 3ware Inc. |
10 | 10 | ||
11 | Kernel compatiblity By: Andre Hedrick <andre@suse.com> | 11 | Kernel compatibility By: Andre Hedrick <andre@suse.com> |
12 | Non-Copyright (C) 2000 Andre Hedrick <andre@suse.com> | 12 | Non-Copyright (C) 2000 Andre Hedrick <andre@suse.com> |
13 | 13 | ||
14 | This program is free software; you can redistribute it and/or modify | 14 | This program is free software; you can redistribute it and/or modify |
diff --git a/drivers/scsi/53c700.scr b/drivers/scsi/53c700.scr index a064a092c604..ec822e3b7a27 100644 --- a/drivers/scsi/53c700.scr +++ b/drivers/scsi/53c700.scr | |||
@@ -31,7 +31,7 @@ ABSOLUTE StatusAddress = 0 ; Addr to receive status return | |||
31 | ABSOLUTE ReceiveMsgAddress = 0 ; Addr to receive msg | 31 | ABSOLUTE ReceiveMsgAddress = 0 ; Addr to receive msg |
32 | ; | 32 | ; |
33 | ; This is the magic component for handling scatter-gather. Each of the | 33 | ; This is the magic component for handling scatter-gather. Each of the |
34 | ; SG components is preceeded by a script fragment which moves the | 34 | ; SG components is preceded by a script fragment which moves the |
35 | ; necessary amount of data and jumps to the next SG segment. The final | 35 | ; necessary amount of data and jumps to the next SG segment. The final |
36 | ; SG segment jumps back to . However, this address is the first SG script | 36 | ; SG segment jumps back to . However, this address is the first SG script |
37 | ; segment. | 37 | ; segment. |
diff --git a/drivers/scsi/53c700_d.h_shipped b/drivers/scsi/53c700_d.h_shipped index 0b42a51257f2..aa623da333c8 100644 --- a/drivers/scsi/53c700_d.h_shipped +++ b/drivers/scsi/53c700_d.h_shipped | |||
@@ -34,7 +34,7 @@ ABSOLUTE StatusAddress = 0 ; Addr to receive status return | |||
34 | ABSOLUTE ReceiveMsgAddress = 0 ; Addr to receive msg | 34 | ABSOLUTE ReceiveMsgAddress = 0 ; Addr to receive msg |
35 | ; | 35 | ; |
36 | ; This is the magic component for handling scatter-gather. Each of the | 36 | ; This is the magic component for handling scatter-gather. Each of the |
37 | ; SG components is preceeded by a script fragment which moves the | 37 | ; SG components is preceded by a script fragment which moves the |
38 | ; necessary amount of data and jumps to the next SG segment. The final | 38 | ; necessary amount of data and jumps to the next SG segment. The final |
39 | ; SG segment jumps back to . However, this address is the first SG script | 39 | ; SG segment jumps back to . However, this address is the first SG script |
40 | ; segment. | 40 | ; segment. |
diff --git a/drivers/scsi/FlashPoint.c b/drivers/scsi/FlashPoint.c index e40cdfb7541f..dcd716d68600 100644 --- a/drivers/scsi/FlashPoint.c +++ b/drivers/scsi/FlashPoint.c | |||
@@ -2509,7 +2509,7 @@ static void FPT_ssel(unsigned long port, unsigned char p_card) | |||
2509 | WR_HARPOON(port + hp_autostart_3, | 2509 | WR_HARPOON(port + hp_autostart_3, |
2510 | (SELECT + SELCHK_STRT)); | 2510 | (SELECT + SELCHK_STRT)); |
2511 | 2511 | ||
2512 | /* Setup our STATE so we know what happend when | 2512 | /* Setup our STATE so we know what happened when |
2513 | the wheels fall off. */ | 2513 | the wheels fall off. */ |
2514 | currSCCB->Sccb_scsistat = SELECT_ST; | 2514 | currSCCB->Sccb_scsistat = SELECT_ST; |
2515 | 2515 | ||
@@ -2900,7 +2900,7 @@ static void FPT_SendMsg(unsigned long port, unsigned char message) | |||
2900 | * | 2900 | * |
2901 | * Function: FPT_sdecm | 2901 | * Function: FPT_sdecm |
2902 | * | 2902 | * |
2903 | * Description: Determine the proper responce to the message from the | 2903 | * Description: Determine the proper response to the message from the |
2904 | * target device. | 2904 | * target device. |
2905 | * | 2905 | * |
2906 | *---------------------------------------------------------------------*/ | 2906 | *---------------------------------------------------------------------*/ |
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index e7cd2fcbe036..165e4dd865d9 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c | |||
@@ -1198,12 +1198,12 @@ static irqreturn_t NCR5380_intr(int dummy, void *dev_id) | |||
1198 | */ | 1198 | */ |
1199 | 1199 | ||
1200 | if ((NCR5380_read(MODE_REG) & MR_DMA) && ((basr & BASR_END_DMA_TRANSFER) || !(basr & BASR_PHASE_MATCH))) { | 1200 | if ((NCR5380_read(MODE_REG) & MR_DMA) && ((basr & BASR_END_DMA_TRANSFER) || !(basr & BASR_PHASE_MATCH))) { |
1201 | int transfered; | 1201 | int transferred; |
1202 | 1202 | ||
1203 | if (!hostdata->connected) | 1203 | if (!hostdata->connected) |
1204 | panic("scsi%d : received end of DMA interrupt with no connected cmd\n", instance->hostno); | 1204 | panic("scsi%d : received end of DMA interrupt with no connected cmd\n", instance->hostno); |
1205 | 1205 | ||
1206 | transfered = (hostdata->dmalen - NCR5380_dma_residual(instance)); | 1206 | transferred = (hostdata->dmalen - NCR5380_dma_residual(instance)); |
1207 | hostdata->connected->SCp.this_residual -= transferred; | 1207 | hostdata->connected->SCp.this_residual -= transferred; |
1208 | hostdata->connected->SCp.ptr += transferred; | 1208 | hostdata->connected->SCp.ptr += transferred; |
1209 | hostdata->dmalen = 0; | 1209 | hostdata->dmalen = 0; |
@@ -1563,7 +1563,7 @@ failed: | |||
1563 | * bytes to transfer, **data - pointer to data pointer. | 1563 | * bytes to transfer, **data - pointer to data pointer. |
1564 | * | 1564 | * |
1565 | * Returns : -1 when different phase is entered without transferring | 1565 | * Returns : -1 when different phase is entered without transferring |
1566 | * maximum number of bytes, 0 if all bytes or transfered or exit | 1566 | * maximum number of bytes, 0 if all bytes or transferred or exit |
1567 | * is in same phase. | 1567 | * is in same phase. |
1568 | * | 1568 | * |
1569 | * Also, *phase, *count, *data are modified in place. | 1569 | * Also, *phase, *count, *data are modified in place. |
@@ -1800,7 +1800,7 @@ static int do_abort(struct Scsi_Host *host) { | |||
1800 | * bytes to transfer, **data - pointer to data pointer. | 1800 | * bytes to transfer, **data - pointer to data pointer. |
1801 | * | 1801 | * |
1802 | * Returns : -1 when different phase is entered without transferring | 1802 | * Returns : -1 when different phase is entered without transferring |
1803 | * maximum number of bytes, 0 if all bytes or transfered or exit | 1803 | * maximum number of bytes, 0 if all bytes or transferred or exit |
1804 | * is in same phase. | 1804 | * is in same phase. |
1805 | * | 1805 | * |
1806 | * Also, *phase, *count, *data are modified in place. | 1806 | * Also, *phase, *count, *data are modified in place. |
diff --git a/drivers/scsi/aacraid/Makefile b/drivers/scsi/aacraid/Makefile index f1cca4ee5410..1bd9fd18f7f3 100644 --- a/drivers/scsi/aacraid/Makefile +++ b/drivers/scsi/aacraid/Makefile | |||
@@ -3,6 +3,6 @@ | |||
3 | obj-$(CONFIG_SCSI_AACRAID) := aacraid.o | 3 | obj-$(CONFIG_SCSI_AACRAID) := aacraid.o |
4 | 4 | ||
5 | aacraid-objs := linit.o aachba.o commctrl.o comminit.o commsup.o \ | 5 | aacraid-objs := linit.o aachba.o commctrl.o comminit.o commsup.o \ |
6 | dpcsup.o rx.o sa.o rkt.o nark.o | 6 | dpcsup.o rx.o sa.o rkt.o nark.o src.o |
7 | 7 | ||
8 | EXTRA_CFLAGS := -Idrivers/scsi | 8 | ccflags-y := -Idrivers/scsi |
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 7df2dd1d2c6f..061995741444 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
@@ -5,7 +5,8 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2010 Adaptec, Inc. |
9 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
@@ -746,8 +747,8 @@ char * get_container_type(unsigned tindex) | |||
746 | * Arguments: [1] pointer to void [1] int | 747 | * Arguments: [1] pointer to void [1] int |
747 | * | 748 | * |
748 | * Purpose: Sets SCSI inquiry data strings for vendor, product | 749 | * Purpose: Sets SCSI inquiry data strings for vendor, product |
749 | * and revision level. Allows strings to be set in platform dependant | 750 | * and revision level. Allows strings to be set in platform dependent |
750 | * files instead of in OS dependant driver source. | 751 | * files instead of in OS dependent driver source. |
751 | */ | 752 | */ |
752 | 753 | ||
753 | static void setinqstr(struct aac_dev *dev, void *data, int tindex) | 754 | static void setinqstr(struct aac_dev *dev, void *data, int tindex) |
@@ -1486,7 +1487,9 @@ int aac_get_adapter_info(struct aac_dev* dev) | |||
1486 | dev->a_ops.adapter_write = aac_write_block; | 1487 | dev->a_ops.adapter_write = aac_write_block; |
1487 | } | 1488 | } |
1488 | dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT; | 1489 | dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT; |
1489 | if(!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) { | 1490 | if (dev->adapter_info.options & AAC_OPT_NEW_COMM_TYPE1) |
1491 | dev->adapter_info.options |= AAC_OPT_NEW_COMM; | ||
1492 | if (!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) { | ||
1490 | /* | 1493 | /* |
1491 | * Worst case size that could cause sg overflow when | 1494 | * Worst case size that could cause sg overflow when |
1492 | * we break up SG elements that are larger than 64KB. | 1495 | * we break up SG elements that are larger than 64KB. |
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 4dbcc055ac78..ffb587817efc 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h | |||
@@ -12,7 +12,7 @@ | |||
12 | *----------------------------------------------------------------------------*/ | 12 | *----------------------------------------------------------------------------*/ |
13 | 13 | ||
14 | #ifndef AAC_DRIVER_BUILD | 14 | #ifndef AAC_DRIVER_BUILD |
15 | # define AAC_DRIVER_BUILD 26400 | 15 | # define AAC_DRIVER_BUILD 28000 |
16 | # define AAC_DRIVER_BRANCH "-ms" | 16 | # define AAC_DRIVER_BRANCH "-ms" |
17 | #endif | 17 | #endif |
18 | #define MAXIMUM_NUM_CONTAINERS 32 | 18 | #define MAXIMUM_NUM_CONTAINERS 32 |
@@ -277,6 +277,16 @@ enum aac_queue_types { | |||
277 | 277 | ||
278 | #define FsaNormal 1 | 278 | #define FsaNormal 1 |
279 | 279 | ||
280 | /* transport FIB header (PMC) */ | ||
281 | struct aac_fib_xporthdr { | ||
282 | u64 HostAddress; /* FIB host address w/o xport header */ | ||
283 | u32 Size; /* FIB size excluding xport header */ | ||
284 | u32 Handle; /* driver handle to reference the FIB */ | ||
285 | u64 Reserved[2]; | ||
286 | }; | ||
287 | |||
288 | #define ALIGN32 32 | ||
289 | |||
280 | /* | 290 | /* |
281 | * Define the FIB. The FIB is the where all the requested data and | 291 | * Define the FIB. The FIB is the where all the requested data and |
282 | * command information are put to the application on the FSA adapter. | 292 | * command information are put to the application on the FSA adapter. |
@@ -394,7 +404,9 @@ enum fib_xfer_state { | |||
394 | AdapterMicroFib = (1<<17), | 404 | AdapterMicroFib = (1<<17), |
395 | BIOSFibPath = (1<<18), | 405 | BIOSFibPath = (1<<18), |
396 | FastResponseCapable = (1<<19), | 406 | FastResponseCapable = (1<<19), |
397 | ApiFib = (1<<20) // Its an API Fib. | 407 | ApiFib = (1<<20), /* Its an API Fib */ |
408 | /* PMC NEW COMM: There is no more AIF data pending */ | ||
409 | NoMoreAifDataAvailable = (1<<21) | ||
398 | }; | 410 | }; |
399 | 411 | ||
400 | /* | 412 | /* |
@@ -404,6 +416,7 @@ enum fib_xfer_state { | |||
404 | 416 | ||
405 | #define ADAPTER_INIT_STRUCT_REVISION 3 | 417 | #define ADAPTER_INIT_STRUCT_REVISION 3 |
406 | #define ADAPTER_INIT_STRUCT_REVISION_4 4 // rocket science | 418 | #define ADAPTER_INIT_STRUCT_REVISION_4 4 // rocket science |
419 | #define ADAPTER_INIT_STRUCT_REVISION_6 6 /* PMC src */ | ||
407 | 420 | ||
408 | struct aac_init | 421 | struct aac_init |
409 | { | 422 | { |
@@ -428,9 +441,15 @@ struct aac_init | |||
428 | #define INITFLAGS_NEW_COMM_SUPPORTED 0x00000001 | 441 | #define INITFLAGS_NEW_COMM_SUPPORTED 0x00000001 |
429 | #define INITFLAGS_DRIVER_USES_UTC_TIME 0x00000010 | 442 | #define INITFLAGS_DRIVER_USES_UTC_TIME 0x00000010 |
430 | #define INITFLAGS_DRIVER_SUPPORTS_PM 0x00000020 | 443 | #define INITFLAGS_DRIVER_SUPPORTS_PM 0x00000020 |
444 | #define INITFLAGS_NEW_COMM_TYPE1_SUPPORTED 0x00000041 | ||
431 | __le32 MaxIoCommands; /* max outstanding commands */ | 445 | __le32 MaxIoCommands; /* max outstanding commands */ |
432 | __le32 MaxIoSize; /* largest I/O command */ | 446 | __le32 MaxIoSize; /* largest I/O command */ |
433 | __le32 MaxFibSize; /* largest FIB to adapter */ | 447 | __le32 MaxFibSize; /* largest FIB to adapter */ |
448 | /* ADAPTER_INIT_STRUCT_REVISION_5 begins here */ | ||
449 | __le32 MaxNumAif; /* max number of aif */ | ||
450 | /* ADAPTER_INIT_STRUCT_REVISION_6 begins here */ | ||
451 | __le32 HostRRQ_AddrLow; | ||
452 | __le32 HostRRQ_AddrHigh; /* Host RRQ (response queue) for SRC */ | ||
434 | }; | 453 | }; |
435 | 454 | ||
436 | enum aac_log_level { | 455 | enum aac_log_level { |
@@ -685,7 +704,7 @@ struct rx_inbound { | |||
685 | #define OutboundDoorbellReg MUnit.ODR | 704 | #define OutboundDoorbellReg MUnit.ODR |
686 | 705 | ||
687 | struct rx_registers { | 706 | struct rx_registers { |
688 | struct rx_mu_registers MUnit; /* 1300h - 1344h */ | 707 | struct rx_mu_registers MUnit; /* 1300h - 1347h */ |
689 | __le32 reserved1[2]; /* 1348h - 134ch */ | 708 | __le32 reserved1[2]; /* 1348h - 134ch */ |
690 | struct rx_inbound IndexRegs; | 709 | struct rx_inbound IndexRegs; |
691 | }; | 710 | }; |
@@ -703,7 +722,7 @@ struct rx_registers { | |||
703 | #define rkt_inbound rx_inbound | 722 | #define rkt_inbound rx_inbound |
704 | 723 | ||
705 | struct rkt_registers { | 724 | struct rkt_registers { |
706 | struct rkt_mu_registers MUnit; /* 1300h - 1344h */ | 725 | struct rkt_mu_registers MUnit; /* 1300h - 1347h */ |
707 | __le32 reserved1[1006]; /* 1348h - 22fch */ | 726 | __le32 reserved1[1006]; /* 1348h - 22fch */ |
708 | struct rkt_inbound IndexRegs; /* 2300h - */ | 727 | struct rkt_inbound IndexRegs; /* 2300h - */ |
709 | }; | 728 | }; |
@@ -713,6 +732,44 @@ struct rkt_registers { | |||
713 | #define rkt_writeb(AEP, CSR, value) writeb(value, &((AEP)->regs.rkt->CSR)) | 732 | #define rkt_writeb(AEP, CSR, value) writeb(value, &((AEP)->regs.rkt->CSR)) |
714 | #define rkt_writel(AEP, CSR, value) writel(value, &((AEP)->regs.rkt->CSR)) | 733 | #define rkt_writel(AEP, CSR, value) writel(value, &((AEP)->regs.rkt->CSR)) |
715 | 734 | ||
735 | /* | ||
736 | * PMC SRC message unit registers | ||
737 | */ | ||
738 | |||
739 | #define src_inbound rx_inbound | ||
740 | |||
741 | struct src_mu_registers { | ||
742 | /* PCI*| Name */ | ||
743 | __le32 reserved0[8]; /* 00h | Reserved */ | ||
744 | __le32 IDR; /* 20h | Inbound Doorbell Register */ | ||
745 | __le32 IISR; /* 24h | Inbound Int. Status Register */ | ||
746 | __le32 reserved1[3]; /* 28h | Reserved */ | ||
747 | __le32 OIMR; /* 34h | Outbound Int. Mask Register */ | ||
748 | __le32 reserved2[25]; /* 38h | Reserved */ | ||
749 | __le32 ODR_R; /* 9ch | Outbound Doorbell Read */ | ||
750 | __le32 ODR_C; /* a0h | Outbound Doorbell Clear */ | ||
751 | __le32 reserved3[6]; /* a4h | Reserved */ | ||
752 | __le32 OMR; /* bch | Outbound Message Register */ | ||
753 | __le32 IQ_L; /* c0h | Inbound Queue (Low address) */ | ||
754 | __le32 IQ_H; /* c4h | Inbound Queue (High address) */ | ||
755 | }; | ||
756 | |||
757 | struct src_registers { | ||
758 | struct src_mu_registers MUnit; /* 00h - c7h */ | ||
759 | __le32 reserved1[130790]; /* c8h - 7fc5fh */ | ||
760 | struct src_inbound IndexRegs; /* 7fc60h */ | ||
761 | }; | ||
762 | |||
763 | #define src_readb(AEP, CSR) readb(&((AEP)->regs.src.bar0->CSR)) | ||
764 | #define src_readl(AEP, CSR) readl(&((AEP)->regs.src.bar0->CSR)) | ||
765 | #define src_writeb(AEP, CSR, value) writeb(value, \ | ||
766 | &((AEP)->regs.src.bar0->CSR)) | ||
767 | #define src_writel(AEP, CSR, value) writel(value, \ | ||
768 | &((AEP)->regs.src.bar0->CSR)) | ||
769 | |||
770 | #define SRC_ODR_SHIFT 12 | ||
771 | #define SRC_IDR_SHIFT 9 | ||
772 | |||
716 | typedef void (*fib_callback)(void *ctxt, struct fib *fibctx); | 773 | typedef void (*fib_callback)(void *ctxt, struct fib *fibctx); |
717 | 774 | ||
718 | struct aac_fib_context { | 775 | struct aac_fib_context { |
@@ -879,6 +936,7 @@ struct aac_supplement_adapter_info | |||
879 | #define AAC_OPTION_MU_RESET cpu_to_le32(0x00000001) | 936 | #define AAC_OPTION_MU_RESET cpu_to_le32(0x00000001) |
880 | #define AAC_OPTION_IGNORE_RESET cpu_to_le32(0x00000002) | 937 | #define AAC_OPTION_IGNORE_RESET cpu_to_le32(0x00000002) |
881 | #define AAC_OPTION_POWER_MANAGEMENT cpu_to_le32(0x00000004) | 938 | #define AAC_OPTION_POWER_MANAGEMENT cpu_to_le32(0x00000004) |
939 | #define AAC_OPTION_DOORBELL_RESET cpu_to_le32(0x00004000) | ||
882 | #define AAC_SIS_VERSION_V3 3 | 940 | #define AAC_SIS_VERSION_V3 3 |
883 | #define AAC_SIS_SLOT_UNKNOWN 0xFF | 941 | #define AAC_SIS_SLOT_UNKNOWN 0xFF |
884 | 942 | ||
@@ -940,6 +998,7 @@ struct aac_bus_info_response { | |||
940 | #define AAC_OPT_SUPPLEMENT_ADAPTER_INFO cpu_to_le32(1<<16) | 998 | #define AAC_OPT_SUPPLEMENT_ADAPTER_INFO cpu_to_le32(1<<16) |
941 | #define AAC_OPT_NEW_COMM cpu_to_le32(1<<17) | 999 | #define AAC_OPT_NEW_COMM cpu_to_le32(1<<17) |
942 | #define AAC_OPT_NEW_COMM_64 cpu_to_le32(1<<18) | 1000 | #define AAC_OPT_NEW_COMM_64 cpu_to_le32(1<<18) |
1001 | #define AAC_OPT_NEW_COMM_TYPE1 cpu_to_le32(1<<28) | ||
943 | 1002 | ||
944 | struct aac_dev | 1003 | struct aac_dev |
945 | { | 1004 | { |
@@ -952,6 +1011,7 @@ struct aac_dev | |||
952 | */ | 1011 | */ |
953 | unsigned max_fib_size; | 1012 | unsigned max_fib_size; |
954 | unsigned sg_tablesize; | 1013 | unsigned sg_tablesize; |
1014 | unsigned max_num_aif; | ||
955 | 1015 | ||
956 | /* | 1016 | /* |
957 | * Map for 128 fib objects (64k) | 1017 | * Map for 128 fib objects (64k) |
@@ -980,10 +1040,21 @@ struct aac_dev | |||
980 | struct adapter_ops a_ops; | 1040 | struct adapter_ops a_ops; |
981 | unsigned long fsrev; /* Main driver's revision number */ | 1041 | unsigned long fsrev; /* Main driver's revision number */ |
982 | 1042 | ||
983 | unsigned base_size; /* Size of mapped in region */ | 1043 | unsigned long dbg_base; /* address of UART |
1044 | * debug buffer */ | ||
1045 | |||
1046 | unsigned base_size, dbg_size; /* Size of | ||
1047 | * mapped in region */ | ||
1048 | |||
984 | struct aac_init *init; /* Holds initialization info to communicate with adapter */ | 1049 | struct aac_init *init; /* Holds initialization info to communicate with adapter */ |
985 | dma_addr_t init_pa; /* Holds physical address of the init struct */ | 1050 | dma_addr_t init_pa; /* Holds physical address of the init struct */ |
986 | 1051 | ||
1052 | u32 *host_rrq; /* response queue | ||
1053 | * if AAC_COMM_MESSAGE_TYPE1 */ | ||
1054 | |||
1055 | dma_addr_t host_rrq_pa; /* phys. address */ | ||
1056 | u32 host_rrq_idx; /* index into rrq buffer */ | ||
1057 | |||
987 | struct pci_dev *pdev; /* Our PCI interface */ | 1058 | struct pci_dev *pdev; /* Our PCI interface */ |
988 | void * printfbuf; /* pointer to buffer used for printf's from the adapter */ | 1059 | void * printfbuf; /* pointer to buffer used for printf's from the adapter */ |
989 | void * comm_addr; /* Base address of Comm area */ | 1060 | void * comm_addr; /* Base address of Comm area */ |
@@ -1003,14 +1074,20 @@ struct aac_dev | |||
1003 | */ | 1074 | */ |
1004 | #ifndef AAC_MIN_FOOTPRINT_SIZE | 1075 | #ifndef AAC_MIN_FOOTPRINT_SIZE |
1005 | # define AAC_MIN_FOOTPRINT_SIZE 8192 | 1076 | # define AAC_MIN_FOOTPRINT_SIZE 8192 |
1077 | # define AAC_MIN_SRC_BAR0_SIZE 0x400000 | ||
1078 | # define AAC_MIN_SRC_BAR1_SIZE 0x800 | ||
1006 | #endif | 1079 | #endif |
1007 | union | 1080 | union |
1008 | { | 1081 | { |
1009 | struct sa_registers __iomem *sa; | 1082 | struct sa_registers __iomem *sa; |
1010 | struct rx_registers __iomem *rx; | 1083 | struct rx_registers __iomem *rx; |
1011 | struct rkt_registers __iomem *rkt; | 1084 | struct rkt_registers __iomem *rkt; |
1085 | struct { | ||
1086 | struct src_registers __iomem *bar0; | ||
1087 | char __iomem *bar1; | ||
1088 | } src; | ||
1012 | } regs; | 1089 | } regs; |
1013 | volatile void __iomem *base; | 1090 | volatile void __iomem *base, *dbg_base_mapped; |
1014 | volatile struct rx_inbound __iomem *IndexRegs; | 1091 | volatile struct rx_inbound __iomem *IndexRegs; |
1015 | u32 OIMR; /* Mask Register Cache */ | 1092 | u32 OIMR; /* Mask Register Cache */ |
1016 | /* | 1093 | /* |
@@ -1031,9 +1108,8 @@ struct aac_dev | |||
1031 | u8 comm_interface; | 1108 | u8 comm_interface; |
1032 | # define AAC_COMM_PRODUCER 0 | 1109 | # define AAC_COMM_PRODUCER 0 |
1033 | # define AAC_COMM_MESSAGE 1 | 1110 | # define AAC_COMM_MESSAGE 1 |
1034 | /* macro side-effects BEWARE */ | 1111 | # define AAC_COMM_MESSAGE_TYPE1 3 |
1035 | # define raw_io_interface \ | 1112 | u8 raw_io_interface; |
1036 | init->InitStructRevision==cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION_4) | ||
1037 | u8 raw_io_64; | 1113 | u8 raw_io_64; |
1038 | u8 printf_enabled; | 1114 | u8 printf_enabled; |
1039 | u8 in_reset; | 1115 | u8 in_reset; |
@@ -1183,7 +1259,7 @@ struct aac_dev | |||
1183 | #define CACHE_UNSTABLE 2 | 1259 | #define CACHE_UNSTABLE 2 |
1184 | 1260 | ||
1185 | /* | 1261 | /* |
1186 | * Lets the client know at which level the data was commited on | 1262 | * Lets the client know at which level the data was committed on |
1187 | * a write request | 1263 | * a write request |
1188 | */ | 1264 | */ |
1189 | 1265 | ||
@@ -1789,6 +1865,10 @@ extern struct aac_common aac_config; | |||
1789 | #define DoorBellAdapterNormCmdNotFull (1<<3) /* Adapter -> Host */ | 1865 | #define DoorBellAdapterNormCmdNotFull (1<<3) /* Adapter -> Host */ |
1790 | #define DoorBellAdapterNormRespNotFull (1<<4) /* Adapter -> Host */ | 1866 | #define DoorBellAdapterNormRespNotFull (1<<4) /* Adapter -> Host */ |
1791 | #define DoorBellPrintfReady (1<<5) /* Adapter -> Host */ | 1867 | #define DoorBellPrintfReady (1<<5) /* Adapter -> Host */ |
1868 | #define DoorBellAifPending (1<<6) /* Adapter -> Host */ | ||
1869 | |||
1870 | /* PMC specific outbound doorbell bits */ | ||
1871 | #define PmDoorBellResponseSent (1<<1) /* Adapter -> Host */ | ||
1792 | 1872 | ||
1793 | /* | 1873 | /* |
1794 | * For FIB communication, we need all of the following things | 1874 | * For FIB communication, we need all of the following things |
@@ -1831,6 +1911,9 @@ extern struct aac_common aac_config; | |||
1831 | #define AifReqAPIJobUpdate 109 /* Update a job report from the API */ | 1911 | #define AifReqAPIJobUpdate 109 /* Update a job report from the API */ |
1832 | #define AifReqAPIJobFinish 110 /* Finish a job from the API */ | 1912 | #define AifReqAPIJobFinish 110 /* Finish a job from the API */ |
1833 | 1913 | ||
1914 | /* PMC NEW COMM: Request the event data */ | ||
1915 | #define AifReqEvent 200 | ||
1916 | |||
1834 | /* | 1917 | /* |
1835 | * Adapter Initiated FIB command structures. Start with the adapter | 1918 | * Adapter Initiated FIB command structures. Start with the adapter |
1836 | * initiated FIBs that really come from the adapter, and get responded | 1919 | * initiated FIBs that really come from the adapter, and get responded |
@@ -1886,10 +1969,13 @@ int aac_rx_init(struct aac_dev *dev); | |||
1886 | int aac_rkt_init(struct aac_dev *dev); | 1969 | int aac_rkt_init(struct aac_dev *dev); |
1887 | int aac_nark_init(struct aac_dev *dev); | 1970 | int aac_nark_init(struct aac_dev *dev); |
1888 | int aac_sa_init(struct aac_dev *dev); | 1971 | int aac_sa_init(struct aac_dev *dev); |
1972 | int aac_src_init(struct aac_dev *dev); | ||
1889 | int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify); | 1973 | int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify); |
1890 | unsigned int aac_response_normal(struct aac_queue * q); | 1974 | unsigned int aac_response_normal(struct aac_queue * q); |
1891 | unsigned int aac_command_normal(struct aac_queue * q); | 1975 | unsigned int aac_command_normal(struct aac_queue * q); |
1892 | unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index); | 1976 | unsigned int aac_intr_normal(struct aac_dev *dev, u32 Index, |
1977 | int isAif, int isFastResponse, | ||
1978 | struct hw_fib *aif_fib); | ||
1893 | int aac_reset_adapter(struct aac_dev * dev, int forced); | 1979 | int aac_reset_adapter(struct aac_dev * dev, int forced); |
1894 | int aac_check_health(struct aac_dev * dev); | 1980 | int aac_check_health(struct aac_dev * dev); |
1895 | int aac_command_thread(void *data); | 1981 | int aac_command_thread(void *data); |
diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c index 645ddd9d9b9e..8a0b33033177 100644 --- a/drivers/scsi/aacraid/commctrl.c +++ b/drivers/scsi/aacraid/commctrl.c | |||
@@ -5,7 +5,8 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2010 Adaptec, Inc. |
9 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c index a7261486ccd4..7ac8fdb5577b 100644 --- a/drivers/scsi/aacraid/comminit.c +++ b/drivers/scsi/aacraid/comminit.c | |||
@@ -5,7 +5,8 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2010 Adaptec, Inc. |
9 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
@@ -52,12 +53,16 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co | |||
52 | unsigned long size, align; | 53 | unsigned long size, align; |
53 | const unsigned long fibsize = 4096; | 54 | const unsigned long fibsize = 4096; |
54 | const unsigned long printfbufsiz = 256; | 55 | const unsigned long printfbufsiz = 256; |
56 | unsigned long host_rrq_size = 0; | ||
55 | struct aac_init *init; | 57 | struct aac_init *init; |
56 | dma_addr_t phys; | 58 | dma_addr_t phys; |
57 | unsigned long aac_max_hostphysmempages; | 59 | unsigned long aac_max_hostphysmempages; |
58 | 60 | ||
59 | size = fibsize + sizeof(struct aac_init) + commsize + commalign + printfbufsiz; | 61 | if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) |
60 | 62 | host_rrq_size = (dev->scsi_host_ptr->can_queue | |
63 | + AAC_NUM_MGT_FIB) * sizeof(u32); | ||
64 | size = fibsize + sizeof(struct aac_init) + commsize + | ||
65 | commalign + printfbufsiz + host_rrq_size; | ||
61 | 66 | ||
62 | base = pci_alloc_consistent(dev->pdev, size, &phys); | 67 | base = pci_alloc_consistent(dev->pdev, size, &phys); |
63 | 68 | ||
@@ -70,8 +75,14 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co | |||
70 | dev->comm_phys = phys; | 75 | dev->comm_phys = phys; |
71 | dev->comm_size = size; | 76 | dev->comm_size = size; |
72 | 77 | ||
73 | dev->init = (struct aac_init *)(base + fibsize); | 78 | if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) { |
74 | dev->init_pa = phys + fibsize; | 79 | dev->host_rrq = (u32 *)(base + fibsize); |
80 | dev->host_rrq_pa = phys + fibsize; | ||
81 | memset(dev->host_rrq, 0, host_rrq_size); | ||
82 | } | ||
83 | |||
84 | dev->init = (struct aac_init *)(base + fibsize + host_rrq_size); | ||
85 | dev->init_pa = phys + fibsize + host_rrq_size; | ||
75 | 86 | ||
76 | init = dev->init; | 87 | init = dev->init; |
77 | 88 | ||
@@ -106,8 +117,13 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co | |||
106 | 117 | ||
107 | init->InitFlags = 0; | 118 | init->InitFlags = 0; |
108 | if (dev->comm_interface == AAC_COMM_MESSAGE) { | 119 | if (dev->comm_interface == AAC_COMM_MESSAGE) { |
109 | init->InitFlags = cpu_to_le32(INITFLAGS_NEW_COMM_SUPPORTED); | 120 | init->InitFlags |= cpu_to_le32(INITFLAGS_NEW_COMM_SUPPORTED); |
110 | dprintk((KERN_WARNING"aacraid: New Comm Interface enabled\n")); | 121 | dprintk((KERN_WARNING"aacraid: New Comm Interface enabled\n")); |
122 | } else if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) { | ||
123 | init->InitStructRevision = cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION_6); | ||
124 | init->InitFlags |= cpu_to_le32(INITFLAGS_NEW_COMM_TYPE1_SUPPORTED); | ||
125 | dprintk((KERN_WARNING | ||
126 | "aacraid: New Comm Interface type1 enabled\n")); | ||
111 | } | 127 | } |
112 | init->InitFlags |= cpu_to_le32(INITFLAGS_DRIVER_USES_UTC_TIME | | 128 | init->InitFlags |= cpu_to_le32(INITFLAGS_DRIVER_USES_UTC_TIME | |
113 | INITFLAGS_DRIVER_SUPPORTS_PM); | 129 | INITFLAGS_DRIVER_SUPPORTS_PM); |
@@ -115,11 +131,18 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co | |||
115 | init->MaxIoSize = cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9); | 131 | init->MaxIoSize = cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9); |
116 | init->MaxFibSize = cpu_to_le32(dev->max_fib_size); | 132 | init->MaxFibSize = cpu_to_le32(dev->max_fib_size); |
117 | 133 | ||
134 | init->MaxNumAif = cpu_to_le32(dev->max_num_aif); | ||
135 | init->HostRRQ_AddrHigh = (u32)((u64)dev->host_rrq_pa >> 32); | ||
136 | init->HostRRQ_AddrLow = (u32)(dev->host_rrq_pa & 0xffffffff); | ||
137 | |||
138 | |||
118 | /* | 139 | /* |
119 | * Increment the base address by the amount already used | 140 | * Increment the base address by the amount already used |
120 | */ | 141 | */ |
121 | base = base + fibsize + sizeof(struct aac_init); | 142 | base = base + fibsize + host_rrq_size + sizeof(struct aac_init); |
122 | phys = (dma_addr_t)((ulong)phys + fibsize + sizeof(struct aac_init)); | 143 | phys = (dma_addr_t)((ulong)phys + fibsize + host_rrq_size + |
144 | sizeof(struct aac_init)); | ||
145 | |||
123 | /* | 146 | /* |
124 | * Align the beginning of Headers to commalign | 147 | * Align the beginning of Headers to commalign |
125 | */ | 148 | */ |
@@ -314,15 +337,22 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev) | |||
314 | - sizeof(struct aac_write) + sizeof(struct sgentry)) | 337 | - sizeof(struct aac_write) + sizeof(struct sgentry)) |
315 | / sizeof(struct sgentry); | 338 | / sizeof(struct sgentry); |
316 | dev->comm_interface = AAC_COMM_PRODUCER; | 339 | dev->comm_interface = AAC_COMM_PRODUCER; |
317 | dev->raw_io_64 = 0; | 340 | dev->raw_io_interface = dev->raw_io_64 = 0; |
341 | |||
318 | if ((!aac_adapter_sync_cmd(dev, GET_ADAPTER_PROPERTIES, | 342 | if ((!aac_adapter_sync_cmd(dev, GET_ADAPTER_PROPERTIES, |
319 | 0, 0, 0, 0, 0, 0, status+0, status+1, status+2, NULL, NULL)) && | 343 | 0, 0, 0, 0, 0, 0, status+0, status+1, status+2, NULL, NULL)) && |
320 | (status[0] == 0x00000001)) { | 344 | (status[0] == 0x00000001)) { |
321 | if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_64)) | 345 | if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_64)) |
322 | dev->raw_io_64 = 1; | 346 | dev->raw_io_64 = 1; |
323 | if (dev->a_ops.adapter_comm && | 347 | if (dev->a_ops.adapter_comm) { |
324 | (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM))) | 348 | if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM_TYPE1)) { |
325 | dev->comm_interface = AAC_COMM_MESSAGE; | 349 | dev->comm_interface = AAC_COMM_MESSAGE_TYPE1; |
350 | dev->raw_io_interface = 1; | ||
351 | } else if (status[1] & le32_to_cpu(AAC_OPT_NEW_COMM)) { | ||
352 | dev->comm_interface = AAC_COMM_MESSAGE; | ||
353 | dev->raw_io_interface = 1; | ||
354 | } | ||
355 | } | ||
326 | if ((dev->comm_interface == AAC_COMM_MESSAGE) && | 356 | if ((dev->comm_interface == AAC_COMM_MESSAGE) && |
327 | (status[2] > dev->base_size)) { | 357 | (status[2] > dev->base_size)) { |
328 | aac_adapter_ioremap(dev, 0); | 358 | aac_adapter_ioremap(dev, 0); |
@@ -350,10 +380,12 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev) | |||
350 | * status[3] & 0xFFFF maximum number FIBs outstanding | 380 | * status[3] & 0xFFFF maximum number FIBs outstanding |
351 | */ | 381 | */ |
352 | host->max_sectors = (status[1] >> 16) << 1; | 382 | host->max_sectors = (status[1] >> 16) << 1; |
353 | dev->max_fib_size = status[1] & 0xFFFF; | 383 | /* Multiple of 32 for PMC */ |
384 | dev->max_fib_size = status[1] & 0xFFE0; | ||
354 | host->sg_tablesize = status[2] >> 16; | 385 | host->sg_tablesize = status[2] >> 16; |
355 | dev->sg_tablesize = status[2] & 0xFFFF; | 386 | dev->sg_tablesize = status[2] & 0xFFFF; |
356 | host->can_queue = (status[3] & 0xFFFF) - AAC_NUM_MGT_FIB; | 387 | host->can_queue = (status[3] & 0xFFFF) - AAC_NUM_MGT_FIB; |
388 | dev->max_num_aif = status[4] & 0xFFFF; | ||
357 | /* | 389 | /* |
358 | * NOTE: | 390 | * NOTE: |
359 | * All these overrides are based on a fixed internal | 391 | * All these overrides are based on a fixed internal |
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index 060ac4bd5a14..e7d0d47b9185 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c | |||
@@ -5,7 +5,8 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2010 Adaptec, Inc. |
9 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
@@ -63,9 +64,11 @@ static int fib_map_alloc(struct aac_dev *dev) | |||
63 | "allocate hardware fibs pci_alloc_consistent(%p, %d * (%d + %d), %p)\n", | 64 | "allocate hardware fibs pci_alloc_consistent(%p, %d * (%d + %d), %p)\n", |
64 | dev->pdev, dev->max_fib_size, dev->scsi_host_ptr->can_queue, | 65 | dev->pdev, dev->max_fib_size, dev->scsi_host_ptr->can_queue, |
65 | AAC_NUM_MGT_FIB, &dev->hw_fib_pa)); | 66 | AAC_NUM_MGT_FIB, &dev->hw_fib_pa)); |
66 | if((dev->hw_fib_va = pci_alloc_consistent(dev->pdev, dev->max_fib_size | 67 | dev->hw_fib_va = pci_alloc_consistent(dev->pdev, |
67 | * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB), | 68 | (dev->max_fib_size + sizeof(struct aac_fib_xporthdr)) |
68 | &dev->hw_fib_pa))==NULL) | 69 | * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) + (ALIGN32 - 1), |
70 | &dev->hw_fib_pa); | ||
71 | if (dev->hw_fib_va == NULL) | ||
69 | return -ENOMEM; | 72 | return -ENOMEM; |
70 | return 0; | 73 | return 0; |
71 | } | 74 | } |
@@ -110,9 +113,22 @@ int aac_fib_setup(struct aac_dev * dev) | |||
110 | if (i<0) | 113 | if (i<0) |
111 | return -ENOMEM; | 114 | return -ENOMEM; |
112 | 115 | ||
116 | /* 32 byte alignment for PMC */ | ||
117 | hw_fib_pa = (dev->hw_fib_pa + (ALIGN32 - 1)) & ~(ALIGN32 - 1); | ||
118 | dev->hw_fib_va = (struct hw_fib *)((unsigned char *)dev->hw_fib_va + | ||
119 | (hw_fib_pa - dev->hw_fib_pa)); | ||
120 | dev->hw_fib_pa = hw_fib_pa; | ||
121 | memset(dev->hw_fib_va, 0, | ||
122 | (dev->max_fib_size + sizeof(struct aac_fib_xporthdr)) * | ||
123 | (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)); | ||
124 | |||
125 | /* add Xport header */ | ||
126 | dev->hw_fib_va = (struct hw_fib *)((unsigned char *)dev->hw_fib_va + | ||
127 | sizeof(struct aac_fib_xporthdr)); | ||
128 | dev->hw_fib_pa += sizeof(struct aac_fib_xporthdr); | ||
129 | |||
113 | hw_fib = dev->hw_fib_va; | 130 | hw_fib = dev->hw_fib_va; |
114 | hw_fib_pa = dev->hw_fib_pa; | 131 | hw_fib_pa = dev->hw_fib_pa; |
115 | memset(hw_fib, 0, dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)); | ||
116 | /* | 132 | /* |
117 | * Initialise the fibs | 133 | * Initialise the fibs |
118 | */ | 134 | */ |
@@ -129,8 +145,10 @@ int aac_fib_setup(struct aac_dev * dev) | |||
129 | hw_fib->header.XferState = cpu_to_le32(0xffffffff); | 145 | hw_fib->header.XferState = cpu_to_le32(0xffffffff); |
130 | hw_fib->header.SenderSize = cpu_to_le16(dev->max_fib_size); | 146 | hw_fib->header.SenderSize = cpu_to_le16(dev->max_fib_size); |
131 | fibptr->hw_fib_pa = hw_fib_pa; | 147 | fibptr->hw_fib_pa = hw_fib_pa; |
132 | hw_fib = (struct hw_fib *)((unsigned char *)hw_fib + dev->max_fib_size); | 148 | hw_fib = (struct hw_fib *)((unsigned char *)hw_fib + |
133 | hw_fib_pa = hw_fib_pa + dev->max_fib_size; | 149 | dev->max_fib_size + sizeof(struct aac_fib_xporthdr)); |
150 | hw_fib_pa = hw_fib_pa + | ||
151 | dev->max_fib_size + sizeof(struct aac_fib_xporthdr); | ||
134 | } | 152 | } |
135 | /* | 153 | /* |
136 | * Add the fib chain to the free list | 154 | * Add the fib chain to the free list |
@@ -403,7 +421,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size, | |||
403 | if (!(hw_fib->header.XferState & cpu_to_le32(HostOwned))) | 421 | if (!(hw_fib->header.XferState & cpu_to_le32(HostOwned))) |
404 | return -EBUSY; | 422 | return -EBUSY; |
405 | /* | 423 | /* |
406 | * There are 5 cases with the wait and reponse requested flags. | 424 | * There are 5 cases with the wait and response requested flags. |
407 | * The only invalid cases are if the caller requests to wait and | 425 | * The only invalid cases are if the caller requests to wait and |
408 | * does not request a response and if the caller does not want a | 426 | * does not request a response and if the caller does not want a |
409 | * response and the Fib is not allocated from pool. If a response | 427 | * response and the Fib is not allocated from pool. If a response |
@@ -664,9 +682,14 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size) | |||
664 | unsigned long nointr = 0; | 682 | unsigned long nointr = 0; |
665 | unsigned long qflags; | 683 | unsigned long qflags; |
666 | 684 | ||
685 | if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE1) { | ||
686 | kfree(hw_fib); | ||
687 | return 0; | ||
688 | } | ||
689 | |||
667 | if (hw_fib->header.XferState == 0) { | 690 | if (hw_fib->header.XferState == 0) { |
668 | if (dev->comm_interface == AAC_COMM_MESSAGE) | 691 | if (dev->comm_interface == AAC_COMM_MESSAGE) |
669 | kfree (hw_fib); | 692 | kfree(hw_fib); |
670 | return 0; | 693 | return 0; |
671 | } | 694 | } |
672 | /* | 695 | /* |
@@ -674,7 +697,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size) | |||
674 | */ | 697 | */ |
675 | if (hw_fib->header.StructType != FIB_MAGIC) { | 698 | if (hw_fib->header.StructType != FIB_MAGIC) { |
676 | if (dev->comm_interface == AAC_COMM_MESSAGE) | 699 | if (dev->comm_interface == AAC_COMM_MESSAGE) |
677 | kfree (hw_fib); | 700 | kfree(hw_fib); |
678 | return -EINVAL; | 701 | return -EINVAL; |
679 | } | 702 | } |
680 | /* | 703 | /* |
diff --git a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c index 9c7408fe8c7d..f0c66a80ad13 100644 --- a/drivers/scsi/aacraid/dpcsup.c +++ b/drivers/scsi/aacraid/dpcsup.c | |||
@@ -5,7 +5,8 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2010 Adaptec, Inc. |
9 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
@@ -228,6 +229,48 @@ unsigned int aac_command_normal(struct aac_queue *q) | |||
228 | return 0; | 229 | return 0; |
229 | } | 230 | } |
230 | 231 | ||
232 | /* | ||
233 | * | ||
234 | * aac_aif_callback | ||
235 | * @context: the context set in the fib - here it is scsi cmd | ||
236 | * @fibptr: pointer to the fib | ||
237 | * | ||
238 | * Handles the AIFs - new method (SRC) | ||
239 | * | ||
240 | */ | ||
241 | |||
242 | static void aac_aif_callback(void *context, struct fib * fibptr) | ||
243 | { | ||
244 | struct fib *fibctx; | ||
245 | struct aac_dev *dev; | ||
246 | struct aac_aifcmd *cmd; | ||
247 | int status; | ||
248 | |||
249 | fibctx = (struct fib *)context; | ||
250 | BUG_ON(fibptr == NULL); | ||
251 | dev = fibptr->dev; | ||
252 | |||
253 | if (fibptr->hw_fib_va->header.XferState & | ||
254 | cpu_to_le32(NoMoreAifDataAvailable)) { | ||
255 | aac_fib_complete(fibptr); | ||
256 | aac_fib_free(fibptr); | ||
257 | return; | ||
258 | } | ||
259 | |||
260 | aac_intr_normal(dev, 0, 1, 0, fibptr->hw_fib_va); | ||
261 | |||
262 | aac_fib_init(fibctx); | ||
263 | cmd = (struct aac_aifcmd *) fib_data(fibctx); | ||
264 | cmd->command = cpu_to_le32(AifReqEvent); | ||
265 | |||
266 | status = aac_fib_send(AifRequest, | ||
267 | fibctx, | ||
268 | sizeof(struct hw_fib)-sizeof(struct aac_fibhdr), | ||
269 | FsaNormal, | ||
270 | 0, 1, | ||
271 | (fib_callback)aac_aif_callback, fibctx); | ||
272 | } | ||
273 | |||
231 | 274 | ||
232 | /** | 275 | /** |
233 | * aac_intr_normal - Handle command replies | 276 | * aac_intr_normal - Handle command replies |
@@ -238,19 +281,17 @@ unsigned int aac_command_normal(struct aac_queue *q) | |||
238 | * know there is a response on our normal priority queue. We will pull off | 281 | * know there is a response on our normal priority queue. We will pull off |
239 | * all QE there are and wake up all the waiters before exiting. | 282 | * all QE there are and wake up all the waiters before exiting. |
240 | */ | 283 | */ |
241 | 284 | unsigned int aac_intr_normal(struct aac_dev *dev, u32 index, | |
242 | unsigned int aac_intr_normal(struct aac_dev * dev, u32 index) | 285 | int isAif, int isFastResponse, struct hw_fib *aif_fib) |
243 | { | 286 | { |
244 | unsigned long mflags; | 287 | unsigned long mflags; |
245 | dprintk((KERN_INFO "aac_intr_normal(%p,%x)\n", dev, index)); | 288 | dprintk((KERN_INFO "aac_intr_normal(%p,%x)\n", dev, index)); |
246 | if ((index & 0x00000002L)) { | 289 | if (isAif == 1) { /* AIF - common */ |
247 | struct hw_fib * hw_fib; | 290 | struct hw_fib * hw_fib; |
248 | struct fib * fib; | 291 | struct fib * fib; |
249 | struct aac_queue *q = &dev->queues->queue[HostNormCmdQueue]; | 292 | struct aac_queue *q = &dev->queues->queue[HostNormCmdQueue]; |
250 | unsigned long flags; | 293 | unsigned long flags; |
251 | 294 | ||
252 | if (index == 0xFFFFFFFEL) /* Special Case */ | ||
253 | return 0; /* Do nothing */ | ||
254 | /* | 295 | /* |
255 | * Allocate a FIB. For non queued stuff we can just use | 296 | * Allocate a FIB. For non queued stuff we can just use |
256 | * the stack so we are happy. We need a fib object in order to | 297 | * the stack so we are happy. We need a fib object in order to |
@@ -263,8 +304,13 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 index) | |||
263 | kfree (fib); | 304 | kfree (fib); |
264 | return 1; | 305 | return 1; |
265 | } | 306 | } |
266 | memcpy(hw_fib, (struct hw_fib *)(((uintptr_t)(dev->regs.sa)) + | 307 | if (aif_fib != NULL) { |
267 | (index & ~0x00000002L)), sizeof(struct hw_fib)); | 308 | memcpy(hw_fib, aif_fib, sizeof(struct hw_fib)); |
309 | } else { | ||
310 | memcpy(hw_fib, | ||
311 | (struct hw_fib *)(((uintptr_t)(dev->regs.sa)) + | ||
312 | index), sizeof(struct hw_fib)); | ||
313 | } | ||
268 | INIT_LIST_HEAD(&fib->fiblink); | 314 | INIT_LIST_HEAD(&fib->fiblink); |
269 | fib->type = FSAFS_NTC_FIB_CONTEXT; | 315 | fib->type = FSAFS_NTC_FIB_CONTEXT; |
270 | fib->size = sizeof(struct fib); | 316 | fib->size = sizeof(struct fib); |
@@ -277,9 +323,26 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 index) | |||
277 | wake_up_interruptible(&q->cmdready); | 323 | wake_up_interruptible(&q->cmdready); |
278 | spin_unlock_irqrestore(q->lock, flags); | 324 | spin_unlock_irqrestore(q->lock, flags); |
279 | return 1; | 325 | return 1; |
326 | } else if (isAif == 2) { /* AIF - new (SRC) */ | ||
327 | struct fib *fibctx; | ||
328 | struct aac_aifcmd *cmd; | ||
329 | |||
330 | fibctx = aac_fib_alloc(dev); | ||
331 | if (!fibctx) | ||
332 | return 1; | ||
333 | aac_fib_init(fibctx); | ||
334 | |||
335 | cmd = (struct aac_aifcmd *) fib_data(fibctx); | ||
336 | cmd->command = cpu_to_le32(AifReqEvent); | ||
337 | |||
338 | return aac_fib_send(AifRequest, | ||
339 | fibctx, | ||
340 | sizeof(struct hw_fib)-sizeof(struct aac_fibhdr), | ||
341 | FsaNormal, | ||
342 | 0, 1, | ||
343 | (fib_callback)aac_aif_callback, fibctx); | ||
280 | } else { | 344 | } else { |
281 | int fast = index & 0x01; | 345 | struct fib *fib = &dev->fibs[index]; |
282 | struct fib * fib = &dev->fibs[index >> 2]; | ||
283 | struct hw_fib * hwfib = fib->hw_fib_va; | 346 | struct hw_fib * hwfib = fib->hw_fib_va; |
284 | 347 | ||
285 | /* | 348 | /* |
@@ -298,7 +361,7 @@ unsigned int aac_intr_normal(struct aac_dev * dev, u32 index) | |||
298 | return 0; | 361 | return 0; |
299 | } | 362 | } |
300 | 363 | ||
301 | if (fast) { | 364 | if (isFastResponse) { |
302 | /* | 365 | /* |
303 | * Doctor the fib | 366 | * Doctor the fib |
304 | */ | 367 | */ |
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 2c93d9496d62..4ff26521d75f 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c | |||
@@ -5,7 +5,8 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2010 Adaptec, Inc. |
9 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
@@ -54,7 +55,7 @@ | |||
54 | 55 | ||
55 | #include "aacraid.h" | 56 | #include "aacraid.h" |
56 | 57 | ||
57 | #define AAC_DRIVER_VERSION "1.1-5" | 58 | #define AAC_DRIVER_VERSION "1.1-7" |
58 | #ifndef AAC_DRIVER_BRANCH | 59 | #ifndef AAC_DRIVER_BRANCH |
59 | #define AAC_DRIVER_BRANCH "" | 60 | #define AAC_DRIVER_BRANCH "" |
60 | #endif | 61 | #endif |
@@ -161,6 +162,7 @@ static const struct pci_device_id aac_pci_tbl[] __devinitdata = { | |||
161 | { 0x9005, 0x0285, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 59 }, /* Adaptec Catch All */ | 162 | { 0x9005, 0x0285, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 59 }, /* Adaptec Catch All */ |
162 | { 0x9005, 0x0286, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 60 }, /* Adaptec Rocket Catch All */ | 163 | { 0x9005, 0x0286, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 60 }, /* Adaptec Rocket Catch All */ |
163 | { 0x9005, 0x0288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 61 }, /* Adaptec NEMER/ARK Catch All */ | 164 | { 0x9005, 0x0288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 61 }, /* Adaptec NEMER/ARK Catch All */ |
165 | { 0x9005, 0x028b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 62 }, /* Adaptec PMC Catch All */ | ||
164 | { 0,} | 166 | { 0,} |
165 | }; | 167 | }; |
166 | MODULE_DEVICE_TABLE(pci, aac_pci_tbl); | 168 | MODULE_DEVICE_TABLE(pci, aac_pci_tbl); |
@@ -235,7 +237,8 @@ static struct aac_driver_ident aac_drivers[] = { | |||
235 | { aac_rx_init, "aacraid", "Legend ", "RAID ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend Catchall */ | 237 | { aac_rx_init, "aacraid", "Legend ", "RAID ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend Catchall */ |
236 | { aac_rx_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec Catch All */ | 238 | { aac_rx_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec Catch All */ |
237 | { aac_rkt_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec Rocket Catch All */ | 239 | { aac_rkt_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec Rocket Catch All */ |
238 | { aac_nark_init, "aacraid", "ADAPTEC ", "RAID ", 2 } /* Adaptec NEMER/ARK Catch All */ | 240 | { aac_nark_init, "aacraid", "ADAPTEC ", "RAID ", 2 }, /* Adaptec NEMER/ARK Catch All */ |
241 | { aac_src_init, "aacraid", "ADAPTEC ", "RAID ", 2 } /* Adaptec PMC Catch All */ | ||
239 | }; | 242 | }; |
240 | 243 | ||
241 | /** | 244 | /** |
@@ -653,8 +656,10 @@ static int aac_eh_reset(struct scsi_cmnd* cmd) | |||
653 | * This adapter needs a blind reset, only do so for Adapters that | 656 | * This adapter needs a blind reset, only do so for Adapters that |
654 | * support a register, instead of a commanded, reset. | 657 | * support a register, instead of a commanded, reset. |
655 | */ | 658 | */ |
656 | if ((aac->supplement_adapter_info.SupportedOptions2 & | 659 | if (((aac->supplement_adapter_info.SupportedOptions2 & |
657 | AAC_OPTION_MU_RESET) && | 660 | AAC_OPTION_MU_RESET) || |
661 | (aac->supplement_adapter_info.SupportedOptions2 & | ||
662 | AAC_OPTION_DOORBELL_RESET)) && | ||
658 | aac_check_reset && | 663 | aac_check_reset && |
659 | ((aac_check_reset != 1) || | 664 | ((aac_check_reset != 1) || |
660 | !(aac->supplement_adapter_info.SupportedOptions2 & | 665 | !(aac->supplement_adapter_info.SupportedOptions2 & |
diff --git a/drivers/scsi/aacraid/nark.c b/drivers/scsi/aacraid/nark.c index c55f7c862f0e..f397d21a0c06 100644 --- a/drivers/scsi/aacraid/nark.c +++ b/drivers/scsi/aacraid/nark.c | |||
@@ -4,7 +4,8 @@ | |||
4 | * based on the old aacraid driver that is.. | 4 | * based on the old aacraid driver that is.. |
5 | * Adaptec aacraid device driver for Linux. | 5 | * Adaptec aacraid device driver for Linux. |
6 | * | 6 | * |
7 | * Copyright (c) 2006-2007 Adaptec, Inc. (aacraid@adaptec.com) | 7 | * Copyright (c) 2000-2010 Adaptec, Inc. |
8 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
8 | * | 9 | * |
9 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License as published by | 11 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/scsi/aacraid/rkt.c b/drivers/scsi/aacraid/rkt.c index 16d8db550027..be44de92429a 100644 --- a/drivers/scsi/aacraid/rkt.c +++ b/drivers/scsi/aacraid/rkt.c | |||
@@ -5,7 +5,8 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2010 Adaptec, Inc. |
9 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c index 84d77fd86e5b..ce530f113fdb 100644 --- a/drivers/scsi/aacraid/rx.c +++ b/drivers/scsi/aacraid/rx.c | |||
@@ -5,7 +5,8 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2010 Adaptec, Inc. |
9 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
@@ -84,15 +85,35 @@ static irqreturn_t aac_rx_intr_producer(int irq, void *dev_id) | |||
84 | 85 | ||
85 | static irqreturn_t aac_rx_intr_message(int irq, void *dev_id) | 86 | static irqreturn_t aac_rx_intr_message(int irq, void *dev_id) |
86 | { | 87 | { |
88 | int isAif, isFastResponse, isSpecial; | ||
87 | struct aac_dev *dev = dev_id; | 89 | struct aac_dev *dev = dev_id; |
88 | u32 Index = rx_readl(dev, MUnit.OutboundQueue); | 90 | u32 Index = rx_readl(dev, MUnit.OutboundQueue); |
89 | if (unlikely(Index == 0xFFFFFFFFL)) | 91 | if (unlikely(Index == 0xFFFFFFFFL)) |
90 | Index = rx_readl(dev, MUnit.OutboundQueue); | 92 | Index = rx_readl(dev, MUnit.OutboundQueue); |
91 | if (likely(Index != 0xFFFFFFFFL)) { | 93 | if (likely(Index != 0xFFFFFFFFL)) { |
92 | do { | 94 | do { |
93 | if (unlikely(aac_intr_normal(dev, Index))) { | 95 | isAif = isFastResponse = isSpecial = 0; |
94 | rx_writel(dev, MUnit.OutboundQueue, Index); | 96 | if (Index & 0x00000002L) { |
95 | rx_writel(dev, MUnit.ODR, DoorBellAdapterNormRespReady); | 97 | isAif = 1; |
98 | if (Index == 0xFFFFFFFEL) | ||
99 | isSpecial = 1; | ||
100 | Index &= ~0x00000002L; | ||
101 | } else { | ||
102 | if (Index & 0x00000001L) | ||
103 | isFastResponse = 1; | ||
104 | Index >>= 2; | ||
105 | } | ||
106 | if (!isSpecial) { | ||
107 | if (unlikely(aac_intr_normal(dev, | ||
108 | Index, isAif, | ||
109 | isFastResponse, NULL))) { | ||
110 | rx_writel(dev, | ||
111 | MUnit.OutboundQueue, | ||
112 | Index); | ||
113 | rx_writel(dev, | ||
114 | MUnit.ODR, | ||
115 | DoorBellAdapterNormRespReady); | ||
116 | } | ||
96 | } | 117 | } |
97 | Index = rx_readl(dev, MUnit.OutboundQueue); | 118 | Index = rx_readl(dev, MUnit.OutboundQueue); |
98 | } while (Index != 0xFFFFFFFFL); | 119 | } while (Index != 0xFFFFFFFFL); |
@@ -631,6 +652,10 @@ int _aac_rx_init(struct aac_dev *dev) | |||
631 | name, instance); | 652 | name, instance); |
632 | goto error_iounmap; | 653 | goto error_iounmap; |
633 | } | 654 | } |
655 | dev->dbg_base = dev->scsi_host_ptr->base; | ||
656 | dev->dbg_base_mapped = dev->base; | ||
657 | dev->dbg_size = dev->base_size; | ||
658 | |||
634 | aac_adapter_enable_int(dev); | 659 | aac_adapter_enable_int(dev); |
635 | /* | 660 | /* |
636 | * Tell the adapter that all is configured, and it can | 661 | * Tell the adapter that all is configured, and it can |
diff --git a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c index 622c21c68e65..e5d4457121ea 100644 --- a/drivers/scsi/aacraid/sa.c +++ b/drivers/scsi/aacraid/sa.c | |||
@@ -5,7 +5,8 @@ | |||
5 | * based on the old aacraid driver that is.. | 5 | * based on the old aacraid driver that is.. |
6 | * Adaptec aacraid device driver for Linux. | 6 | * Adaptec aacraid device driver for Linux. |
7 | * | 7 | * |
8 | * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com) | 8 | * Copyright (c) 2000-2010 Adaptec, Inc. |
9 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
9 | * | 10 | * |
10 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
@@ -391,6 +392,10 @@ int aac_sa_init(struct aac_dev *dev) | |||
391 | name, instance); | 392 | name, instance); |
392 | goto error_iounmap; | 393 | goto error_iounmap; |
393 | } | 394 | } |
395 | dev->dbg_base = dev->scsi_host_ptr->base; | ||
396 | dev->dbg_base_mapped = dev->base; | ||
397 | dev->dbg_size = dev->base_size; | ||
398 | |||
394 | aac_adapter_enable_int(dev); | 399 | aac_adapter_enable_int(dev); |
395 | 400 | ||
396 | /* | 401 | /* |
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c new file mode 100644 index 000000000000..c20494660603 --- /dev/null +++ b/drivers/scsi/aacraid/src.c | |||
@@ -0,0 +1,594 @@ | |||
1 | /* | ||
2 | * Adaptec AAC series RAID controller driver | ||
3 | * (c) Copyright 2001 Red Hat Inc. | ||
4 | * | ||
5 | * based on the old aacraid driver that is.. | ||
6 | * Adaptec aacraid device driver for Linux. | ||
7 | * | ||
8 | * Copyright (c) 2000-2010 Adaptec, Inc. | ||
9 | * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com) | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License as published by | ||
13 | * the Free Software Foundation; either version 2, or (at your option) | ||
14 | * any later version. | ||
15 | * | ||
16 | * This program is distributed in the hope that it will be useful, | ||
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
19 | * GNU General Public License for more details. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; see the file COPYING. If not, write to | ||
23 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | * | ||
25 | * Module Name: | ||
26 | * src.c | ||
27 | * | ||
28 | * Abstract: Hardware Device Interface for PMC SRC based controllers | ||
29 | * | ||
30 | */ | ||
31 | |||
32 | #include <linux/kernel.h> | ||
33 | #include <linux/init.h> | ||
34 | #include <linux/types.h> | ||
35 | #include <linux/pci.h> | ||
36 | #include <linux/spinlock.h> | ||
37 | #include <linux/slab.h> | ||
38 | #include <linux/blkdev.h> | ||
39 | #include <linux/delay.h> | ||
40 | #include <linux/version.h> | ||
41 | #include <linux/completion.h> | ||
42 | #include <linux/time.h> | ||
43 | #include <linux/interrupt.h> | ||
44 | #include <scsi/scsi_host.h> | ||
45 | |||
46 | #include "aacraid.h" | ||
47 | |||
48 | static irqreturn_t aac_src_intr_message(int irq, void *dev_id) | ||
49 | { | ||
50 | struct aac_dev *dev = dev_id; | ||
51 | unsigned long bellbits, bellbits_shifted; | ||
52 | int our_interrupt = 0; | ||
53 | int isFastResponse; | ||
54 | u32 index, handle; | ||
55 | |||
56 | bellbits = src_readl(dev, MUnit.ODR_R); | ||
57 | if (bellbits & PmDoorBellResponseSent) { | ||
58 | bellbits = PmDoorBellResponseSent; | ||
59 | /* handle async. status */ | ||
60 | our_interrupt = 1; | ||
61 | index = dev->host_rrq_idx; | ||
62 | if (dev->host_rrq[index] == 0) { | ||
63 | u32 old_index = index; | ||
64 | /* adjust index */ | ||
65 | do { | ||
66 | index++; | ||
67 | if (index == dev->scsi_host_ptr->can_queue + | ||
68 | AAC_NUM_MGT_FIB) | ||
69 | index = 0; | ||
70 | if (dev->host_rrq[index] != 0) | ||
71 | break; | ||
72 | } while (index != old_index); | ||
73 | dev->host_rrq_idx = index; | ||
74 | } | ||
75 | for (;;) { | ||
76 | isFastResponse = 0; | ||
77 | /* remove toggle bit (31) */ | ||
78 | handle = (dev->host_rrq[index] & 0x7fffffff); | ||
79 | /* check fast response bit (30) */ | ||
80 | if (handle & 0x40000000) | ||
81 | isFastResponse = 1; | ||
82 | handle &= 0x0000ffff; | ||
83 | if (handle == 0) | ||
84 | break; | ||
85 | |||
86 | aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL); | ||
87 | |||
88 | dev->host_rrq[index++] = 0; | ||
89 | if (index == dev->scsi_host_ptr->can_queue + | ||
90 | AAC_NUM_MGT_FIB) | ||
91 | index = 0; | ||
92 | dev->host_rrq_idx = index; | ||
93 | } | ||
94 | } else { | ||
95 | bellbits_shifted = (bellbits >> SRC_ODR_SHIFT); | ||
96 | if (bellbits_shifted & DoorBellAifPending) { | ||
97 | our_interrupt = 1; | ||
98 | /* handle AIF */ | ||
99 | aac_intr_normal(dev, 0, 2, 0, NULL); | ||
100 | } | ||
101 | } | ||
102 | |||
103 | if (our_interrupt) { | ||
104 | src_writel(dev, MUnit.ODR_C, bellbits); | ||
105 | return IRQ_HANDLED; | ||
106 | } | ||
107 | return IRQ_NONE; | ||
108 | } | ||
109 | |||
110 | /** | ||
111 | * aac_src_disable_interrupt - Disable interrupts | ||
112 | * @dev: Adapter | ||
113 | */ | ||
114 | |||
115 | static void aac_src_disable_interrupt(struct aac_dev *dev) | ||
116 | { | ||
117 | src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff); | ||
118 | } | ||
119 | |||
120 | /** | ||
121 | * aac_src_enable_interrupt_message - Enable interrupts | ||
122 | * @dev: Adapter | ||
123 | */ | ||
124 | |||
125 | static void aac_src_enable_interrupt_message(struct aac_dev *dev) | ||
126 | { | ||
127 | src_writel(dev, MUnit.OIMR, dev->OIMR = 0xfffffff8); | ||
128 | } | ||
129 | |||
130 | /** | ||
131 | * src_sync_cmd - send a command and wait | ||
132 | * @dev: Adapter | ||
133 | * @command: Command to execute | ||
134 | * @p1: first parameter | ||
135 | * @ret: adapter status | ||
136 | * | ||
137 | * This routine will send a synchronous command to the adapter and wait | ||
138 | * for its completion. | ||
139 | */ | ||
140 | |||
141 | static int src_sync_cmd(struct aac_dev *dev, u32 command, | ||
142 | u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, | ||
143 | u32 *status, u32 * r1, u32 * r2, u32 * r3, u32 * r4) | ||
144 | { | ||
145 | unsigned long start; | ||
146 | int ok; | ||
147 | |||
148 | /* | ||
149 | * Write the command into Mailbox 0 | ||
150 | */ | ||
151 | writel(command, &dev->IndexRegs->Mailbox[0]); | ||
152 | /* | ||
153 | * Write the parameters into Mailboxes 1 - 6 | ||
154 | */ | ||
155 | writel(p1, &dev->IndexRegs->Mailbox[1]); | ||
156 | writel(p2, &dev->IndexRegs->Mailbox[2]); | ||
157 | writel(p3, &dev->IndexRegs->Mailbox[3]); | ||
158 | writel(p4, &dev->IndexRegs->Mailbox[4]); | ||
159 | |||
160 | /* | ||
161 | * Clear the synch command doorbell to start on a clean slate. | ||
162 | */ | ||
163 | src_writel(dev, MUnit.ODR_C, OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT); | ||
164 | |||
165 | /* | ||
166 | * Disable doorbell interrupts | ||
167 | */ | ||
168 | src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff); | ||
169 | |||
170 | /* | ||
171 | * Force the completion of the mask register write before issuing | ||
172 | * the interrupt. | ||
173 | */ | ||
174 | src_readl(dev, MUnit.OIMR); | ||
175 | |||
176 | /* | ||
177 | * Signal that there is a new synch command | ||
178 | */ | ||
179 | src_writel(dev, MUnit.IDR, INBOUNDDOORBELL_0 << SRC_IDR_SHIFT); | ||
180 | |||
181 | ok = 0; | ||
182 | start = jiffies; | ||
183 | |||
184 | /* | ||
185 | * Wait up to 30 seconds | ||
186 | */ | ||
187 | while (time_before(jiffies, start+30*HZ)) { | ||
188 | /* Delay 5 microseconds to let Mon960 get info. */ | ||
189 | udelay(5); | ||
190 | |||
191 | /* Mon960 will set doorbell0 bit | ||
192 | * when it has completed the command | ||
193 | */ | ||
194 | if ((src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT) & OUTBOUNDDOORBELL_0) { | ||
195 | /* Clear the doorbell */ | ||
196 | src_writel(dev, | ||
197 | MUnit.ODR_C, | ||
198 | OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT); | ||
199 | ok = 1; | ||
200 | break; | ||
201 | } | ||
202 | |||
203 | /* Yield the processor in case we are slow */ | ||
204 | msleep(1); | ||
205 | } | ||
206 | if (unlikely(ok != 1)) { | ||
207 | /* Restore interrupt mask even though we timed out */ | ||
208 | aac_adapter_enable_int(dev); | ||
209 | return -ETIMEDOUT; | ||
210 | } | ||
211 | |||
212 | /* Pull the synch status from Mailbox 0 */ | ||
213 | if (status) | ||
214 | *status = readl(&dev->IndexRegs->Mailbox[0]); | ||
215 | if (r1) | ||
216 | *r1 = readl(&dev->IndexRegs->Mailbox[1]); | ||
217 | if (r2) | ||
218 | *r2 = readl(&dev->IndexRegs->Mailbox[2]); | ||
219 | if (r3) | ||
220 | *r3 = readl(&dev->IndexRegs->Mailbox[3]); | ||
221 | if (r4) | ||
222 | *r4 = readl(&dev->IndexRegs->Mailbox[4]); | ||
223 | |||
224 | /* Clear the synch command doorbell */ | ||
225 | src_writel(dev, MUnit.ODR_C, OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT); | ||
226 | |||
227 | /* Restore interrupt mask */ | ||
228 | aac_adapter_enable_int(dev); | ||
229 | return 0; | ||
230 | |||
231 | } | ||
232 | |||
233 | /** | ||
234 | * aac_src_interrupt_adapter - interrupt adapter | ||
235 | * @dev: Adapter | ||
236 | * | ||
237 | * Send an interrupt to the i960 and breakpoint it. | ||
238 | */ | ||
239 | |||
240 | static void aac_src_interrupt_adapter(struct aac_dev *dev) | ||
241 | { | ||
242 | src_sync_cmd(dev, BREAKPOINT_REQUEST, | ||
243 | 0, 0, 0, 0, 0, 0, | ||
244 | NULL, NULL, NULL, NULL, NULL); | ||
245 | } | ||
246 | |||
247 | /** | ||
248 | * aac_src_notify_adapter - send an event to the adapter | ||
249 | * @dev: Adapter | ||
250 | * @event: Event to send | ||
251 | * | ||
252 | * Notify the i960 that something it probably cares about has | ||
253 | * happened. | ||
254 | */ | ||
255 | |||
256 | static void aac_src_notify_adapter(struct aac_dev *dev, u32 event) | ||
257 | { | ||
258 | switch (event) { | ||
259 | |||
260 | case AdapNormCmdQue: | ||
261 | src_writel(dev, MUnit.ODR_C, | ||
262 | INBOUNDDOORBELL_1 << SRC_ODR_SHIFT); | ||
263 | break; | ||
264 | case HostNormRespNotFull: | ||
265 | src_writel(dev, MUnit.ODR_C, | ||
266 | INBOUNDDOORBELL_4 << SRC_ODR_SHIFT); | ||
267 | break; | ||
268 | case AdapNormRespQue: | ||
269 | src_writel(dev, MUnit.ODR_C, | ||
270 | INBOUNDDOORBELL_2 << SRC_ODR_SHIFT); | ||
271 | break; | ||
272 | case HostNormCmdNotFull: | ||
273 | src_writel(dev, MUnit.ODR_C, | ||
274 | INBOUNDDOORBELL_3 << SRC_ODR_SHIFT); | ||
275 | break; | ||
276 | case FastIo: | ||
277 | src_writel(dev, MUnit.ODR_C, | ||
278 | INBOUNDDOORBELL_6 << SRC_ODR_SHIFT); | ||
279 | break; | ||
280 | case AdapPrintfDone: | ||
281 | src_writel(dev, MUnit.ODR_C, | ||
282 | INBOUNDDOORBELL_5 << SRC_ODR_SHIFT); | ||
283 | break; | ||
284 | default: | ||
285 | BUG(); | ||
286 | break; | ||
287 | } | ||
288 | } | ||
289 | |||
290 | /** | ||
291 | * aac_src_start_adapter - activate adapter | ||
292 | * @dev: Adapter | ||
293 | * | ||
294 | * Start up processing on an i960 based AAC adapter | ||
295 | */ | ||
296 | |||
297 | static void aac_src_start_adapter(struct aac_dev *dev) | ||
298 | { | ||
299 | struct aac_init *init; | ||
300 | |||
301 | init = dev->init; | ||
302 | init->HostElapsedSeconds = cpu_to_le32(get_seconds()); | ||
303 | |||
304 | /* We can only use a 32 bit address here */ | ||
305 | src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa, | ||
306 | 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL); | ||
307 | } | ||
308 | |||
309 | /** | ||
310 | * aac_src_check_health | ||
311 | * @dev: device to check if healthy | ||
312 | * | ||
313 | * Will attempt to determine if the specified adapter is alive and | ||
314 | * capable of handling requests, returning 0 if alive. | ||
315 | */ | ||
316 | static int aac_src_check_health(struct aac_dev *dev) | ||
317 | { | ||
318 | u32 status = src_readl(dev, MUnit.OMR); | ||
319 | |||
320 | /* | ||
321 | * Check to see if the board failed any self tests. | ||
322 | */ | ||
323 | if (unlikely(status & SELF_TEST_FAILED)) | ||
324 | return -1; | ||
325 | |||
326 | /* | ||
327 | * Check to see if the board panic'd. | ||
328 | */ | ||
329 | if (unlikely(status & KERNEL_PANIC)) | ||
330 | return (status >> 16) & 0xFF; | ||
331 | /* | ||
332 | * Wait for the adapter to be up and running. | ||
333 | */ | ||
334 | if (unlikely(!(status & KERNEL_UP_AND_RUNNING))) | ||
335 | return -3; | ||
336 | /* | ||
337 | * Everything is OK | ||
338 | */ | ||
339 | return 0; | ||
340 | } | ||
341 | |||
342 | /** | ||
343 | * aac_src_deliver_message | ||
344 | * @fib: fib to issue | ||
345 | * | ||
346 | * Will send a fib, returning 0 if successful. | ||
347 | */ | ||
348 | static int aac_src_deliver_message(struct fib *fib) | ||
349 | { | ||
350 | struct aac_dev *dev = fib->dev; | ||
351 | struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue]; | ||
352 | unsigned long qflags; | ||
353 | u32 fibsize; | ||
354 | u64 address; | ||
355 | struct aac_fib_xporthdr *pFibX; | ||
356 | |||
357 | spin_lock_irqsave(q->lock, qflags); | ||
358 | q->numpending++; | ||
359 | spin_unlock_irqrestore(q->lock, qflags); | ||
360 | |||
361 | /* Calculate the amount to the fibsize bits */ | ||
362 | fibsize = (sizeof(struct aac_fib_xporthdr) + | ||
363 | fib->hw_fib_va->header.Size + 127) / 128 - 1; | ||
364 | if (fibsize > (ALIGN32 - 1)) | ||
365 | fibsize = ALIGN32 - 1; | ||
366 | |||
367 | /* Fill XPORT header */ | ||
368 | pFibX = (struct aac_fib_xporthdr *) | ||
369 | ((unsigned char *)fib->hw_fib_va - | ||
370 | sizeof(struct aac_fib_xporthdr)); | ||
371 | pFibX->Handle = fib->hw_fib_va->header.SenderData + 1; | ||
372 | pFibX->HostAddress = fib->hw_fib_pa; | ||
373 | pFibX->Size = fib->hw_fib_va->header.Size; | ||
374 | address = fib->hw_fib_pa - (u64)sizeof(struct aac_fib_xporthdr); | ||
375 | |||
376 | src_writel(dev, MUnit.IQ_H, (u32)(address >> 32)); | ||
377 | src_writel(dev, MUnit.IQ_L, (u32)(address & 0xffffffff) + fibsize); | ||
378 | return 0; | ||
379 | } | ||
380 | |||
381 | /** | ||
382 | * aac_src_ioremap | ||
383 | * @size: mapping resize request | ||
384 | * | ||
385 | */ | ||
386 | static int aac_src_ioremap(struct aac_dev *dev, u32 size) | ||
387 | { | ||
388 | if (!size) { | ||
389 | iounmap(dev->regs.src.bar0); | ||
390 | dev->regs.src.bar0 = NULL; | ||
391 | iounmap(dev->base); | ||
392 | dev->base = NULL; | ||
393 | return 0; | ||
394 | } | ||
395 | dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2), | ||
396 | AAC_MIN_SRC_BAR1_SIZE); | ||
397 | dev->base = NULL; | ||
398 | if (dev->regs.src.bar1 == NULL) | ||
399 | return -1; | ||
400 | dev->base = dev->regs.src.bar0 = ioremap(dev->scsi_host_ptr->base, | ||
401 | size); | ||
402 | if (dev->base == NULL) { | ||
403 | iounmap(dev->regs.src.bar1); | ||
404 | dev->regs.src.bar1 = NULL; | ||
405 | return -1; | ||
406 | } | ||
407 | dev->IndexRegs = &((struct src_registers __iomem *) | ||
408 | dev->base)->IndexRegs; | ||
409 | return 0; | ||
410 | } | ||
411 | |||
412 | static int aac_src_restart_adapter(struct aac_dev *dev, int bled) | ||
413 | { | ||
414 | u32 var, reset_mask; | ||
415 | |||
416 | if (bled >= 0) { | ||
417 | if (bled) | ||
418 | printk(KERN_ERR "%s%d: adapter kernel panic'd %x.\n", | ||
419 | dev->name, dev->id, bled); | ||
420 | bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, | ||
421 | 0, 0, 0, 0, 0, 0, &var, &reset_mask, NULL, NULL, NULL); | ||
422 | if (bled || (var != 0x00000001)) | ||
423 | bled = -EINVAL; | ||
424 | if (dev->supplement_adapter_info.SupportedOptions2 & | ||
425 | AAC_OPTION_DOORBELL_RESET) { | ||
426 | src_writel(dev, MUnit.IDR, reset_mask); | ||
427 | msleep(5000); /* Delay 5 seconds */ | ||
428 | } | ||
429 | } | ||
430 | |||
431 | if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC) | ||
432 | return -ENODEV; | ||
433 | |||
434 | if (startup_timeout < 300) | ||
435 | startup_timeout = 300; | ||
436 | |||
437 | return 0; | ||
438 | } | ||
439 | |||
440 | /** | ||
441 | * aac_src_select_comm - Select communications method | ||
442 | * @dev: Adapter | ||
443 | * @comm: communications method | ||
444 | */ | ||
445 | int aac_src_select_comm(struct aac_dev *dev, int comm) | ||
446 | { | ||
447 | switch (comm) { | ||
448 | case AAC_COMM_MESSAGE: | ||
449 | dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message; | ||
450 | dev->a_ops.adapter_intr = aac_src_intr_message; | ||
451 | dev->a_ops.adapter_deliver = aac_src_deliver_message; | ||
452 | break; | ||
453 | default: | ||
454 | return 1; | ||
455 | } | ||
456 | return 0; | ||
457 | } | ||
458 | |||
459 | /** | ||
460 | * aac_src_init - initialize an Cardinal Frey Bar card | ||
461 | * @dev: device to configure | ||
462 | * | ||
463 | */ | ||
464 | |||
465 | int aac_src_init(struct aac_dev *dev) | ||
466 | { | ||
467 | unsigned long start; | ||
468 | unsigned long status; | ||
469 | int restart = 0; | ||
470 | int instance = dev->id; | ||
471 | const char *name = dev->name; | ||
472 | |||
473 | dev->a_ops.adapter_ioremap = aac_src_ioremap; | ||
474 | dev->a_ops.adapter_comm = aac_src_select_comm; | ||
475 | |||
476 | dev->base_size = AAC_MIN_SRC_BAR0_SIZE; | ||
477 | if (aac_adapter_ioremap(dev, dev->base_size)) { | ||
478 | printk(KERN_WARNING "%s: unable to map adapter.\n", name); | ||
479 | goto error_iounmap; | ||
480 | } | ||
481 | |||
482 | /* Failure to reset here is an option ... */ | ||
483 | dev->a_ops.adapter_sync_cmd = src_sync_cmd; | ||
484 | dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; | ||
485 | if ((aac_reset_devices || reset_devices) && | ||
486 | !aac_src_restart_adapter(dev, 0)) | ||
487 | ++restart; | ||
488 | /* | ||
489 | * Check to see if the board panic'd while booting. | ||
490 | */ | ||
491 | status = src_readl(dev, MUnit.OMR); | ||
492 | if (status & KERNEL_PANIC) { | ||
493 | if (aac_src_restart_adapter(dev, aac_src_check_health(dev))) | ||
494 | goto error_iounmap; | ||
495 | ++restart; | ||
496 | } | ||
497 | /* | ||
498 | * Check to see if the board failed any self tests. | ||
499 | */ | ||
500 | status = src_readl(dev, MUnit.OMR); | ||
501 | if (status & SELF_TEST_FAILED) { | ||
502 | printk(KERN_ERR "%s%d: adapter self-test failed.\n", | ||
503 | dev->name, instance); | ||
504 | goto error_iounmap; | ||
505 | } | ||
506 | /* | ||
507 | * Check to see if the monitor panic'd while booting. | ||
508 | */ | ||
509 | if (status & MONITOR_PANIC) { | ||
510 | printk(KERN_ERR "%s%d: adapter monitor panic.\n", | ||
511 | dev->name, instance); | ||
512 | goto error_iounmap; | ||
513 | } | ||
514 | start = jiffies; | ||
515 | /* | ||
516 | * Wait for the adapter to be up and running. Wait up to 3 minutes | ||
517 | */ | ||
518 | while (!((status = src_readl(dev, MUnit.OMR)) & | ||
519 | KERNEL_UP_AND_RUNNING)) { | ||
520 | if ((restart && | ||
521 | (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) || | ||
522 | time_after(jiffies, start+HZ*startup_timeout)) { | ||
523 | printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n", | ||
524 | dev->name, instance, status); | ||
525 | goto error_iounmap; | ||
526 | } | ||
527 | if (!restart && | ||
528 | ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) || | ||
529 | time_after(jiffies, start + HZ * | ||
530 | ((startup_timeout > 60) | ||
531 | ? (startup_timeout - 60) | ||
532 | : (startup_timeout / 2))))) { | ||
533 | if (likely(!aac_src_restart_adapter(dev, | ||
534 | aac_src_check_health(dev)))) | ||
535 | start = jiffies; | ||
536 | ++restart; | ||
537 | } | ||
538 | msleep(1); | ||
539 | } | ||
540 | if (restart && aac_commit) | ||
541 | aac_commit = 1; | ||
542 | /* | ||
543 | * Fill in the common function dispatch table. | ||
544 | */ | ||
545 | dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter; | ||
546 | dev->a_ops.adapter_disable_int = aac_src_disable_interrupt; | ||
547 | dev->a_ops.adapter_notify = aac_src_notify_adapter; | ||
548 | dev->a_ops.adapter_sync_cmd = src_sync_cmd; | ||
549 | dev->a_ops.adapter_check_health = aac_src_check_health; | ||
550 | dev->a_ops.adapter_restart = aac_src_restart_adapter; | ||
551 | |||
552 | /* | ||
553 | * First clear out all interrupts. Then enable the one's that we | ||
554 | * can handle. | ||
555 | */ | ||
556 | aac_adapter_comm(dev, AAC_COMM_MESSAGE); | ||
557 | aac_adapter_disable_int(dev); | ||
558 | src_writel(dev, MUnit.ODR_C, 0xffffffff); | ||
559 | aac_adapter_enable_int(dev); | ||
560 | |||
561 | if (aac_init_adapter(dev) == NULL) | ||
562 | goto error_iounmap; | ||
563 | if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1) | ||
564 | goto error_iounmap; | ||
565 | |||
566 | dev->msi = aac_msi && !pci_enable_msi(dev->pdev); | ||
567 | |||
568 | if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, | ||
569 | IRQF_SHARED|IRQF_DISABLED, "aacraid", dev) < 0) { | ||
570 | |||
571 | if (dev->msi) | ||
572 | pci_disable_msi(dev->pdev); | ||
573 | |||
574 | printk(KERN_ERR "%s%d: Interrupt unavailable.\n", | ||
575 | name, instance); | ||
576 | goto error_iounmap; | ||
577 | } | ||
578 | dev->dbg_base = pci_resource_start(dev->pdev, 2); | ||
579 | dev->dbg_base_mapped = dev->regs.src.bar1; | ||
580 | dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE; | ||
581 | |||
582 | aac_adapter_enable_int(dev); | ||
583 | /* | ||
584 | * Tell the adapter that all is configured, and it can | ||
585 | * start accepting requests | ||
586 | */ | ||
587 | aac_src_start_adapter(dev); | ||
588 | |||
589 | return 0; | ||
590 | |||
591 | error_iounmap: | ||
592 | |||
593 | return -1; | ||
594 | } | ||
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c index 081c6de92bc5..bfd618a69499 100644 --- a/drivers/scsi/advansys.c +++ b/drivers/scsi/advansys.c | |||
@@ -4544,7 +4544,7 @@ AscMemWordCopyPtrToLram(PortAddr iop_base, ushort s_addr, | |||
4544 | * Copy 4 bytes to LRAM. | 4544 | * Copy 4 bytes to LRAM. |
4545 | * | 4545 | * |
4546 | * The source data is assumed to be in little-endian order in memory | 4546 | * The source data is assumed to be in little-endian order in memory |
4547 | * and is maintained in little-endian order when writen to LRAM. | 4547 | * and is maintained in little-endian order when written to LRAM. |
4548 | */ | 4548 | */ |
4549 | static void | 4549 | static void |
4550 | AscMemDWordCopyPtrToLram(PortAddr iop_base, | 4550 | AscMemDWordCopyPtrToLram(PortAddr iop_base, |
diff --git a/drivers/scsi/aha1740.c b/drivers/scsi/aha1740.c index d058f1ab82b5..1c10b796c1a2 100644 --- a/drivers/scsi/aha1740.c +++ b/drivers/scsi/aha1740.c | |||
@@ -461,7 +461,7 @@ static int aha1740_queuecommand_lck(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *) | |||
461 | /* The Adaptec Spec says the card is so fast that the loops | 461 | /* The Adaptec Spec says the card is so fast that the loops |
462 | will only be executed once in the code below. Even if this | 462 | will only be executed once in the code below. Even if this |
463 | was true with the fastest processors when the spec was | 463 | was true with the fastest processors when the spec was |
464 | written, it doesn't seem to be true with todays fast | 464 | written, it doesn't seem to be true with today's fast |
465 | processors. We print a warning if the code is executed more | 465 | processors. We print a warning if the code is executed more |
466 | often than LOOPCNT_WARN. If this happens, it should be | 466 | often than LOOPCNT_WARN. If this happens, it should be |
467 | investigated. If the count reaches LOOPCNT_MAX, we assume | 467 | investigated. If the count reaches LOOPCNT_MAX, we assume |
diff --git a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h index 95ee50385188..9b059422aacb 100644 --- a/drivers/scsi/aic7xxx/aic79xx.h +++ b/drivers/scsi/aic7xxx/aic79xx.h | |||
@@ -473,7 +473,7 @@ struct hardware_scb { | |||
473 | * o A residual has occurred if SG_FULL_RESID is set in sgptr, | 473 | * o A residual has occurred if SG_FULL_RESID is set in sgptr, |
474 | * or residual_sgptr does not have SG_LIST_NULL set. | 474 | * or residual_sgptr does not have SG_LIST_NULL set. |
475 | * | 475 | * |
476 | * o We are transfering the last segment if residual_datacnt has | 476 | * o We are transferring the last segment if residual_datacnt has |
477 | * the SG_LAST_SEG flag set. | 477 | * the SG_LAST_SEG flag set. |
478 | * | 478 | * |
479 | * Host: | 479 | * Host: |
@@ -516,7 +516,7 @@ struct hardware_scb { | |||
516 | */ | 516 | */ |
517 | 517 | ||
518 | /* | 518 | /* |
519 | * Definition of a scatter/gather element as transfered to the controller. | 519 | * Definition of a scatter/gather element as transferred to the controller. |
520 | * The aic7xxx chips only support a 24bit length. We use the top byte of | 520 | * The aic7xxx chips only support a 24bit length. We use the top byte of |
521 | * the length to store additional address bits and a flag to indicate | 521 | * the length to store additional address bits and a flag to indicate |
522 | * that a given segment terminates the transfer. This gives us an | 522 | * that a given segment terminates the transfer. This gives us an |
diff --git a/drivers/scsi/aic7xxx/aic79xx.reg b/drivers/scsi/aic7xxx/aic79xx.reg index 0666c22ab55b..7e12c31ccfda 100644 --- a/drivers/scsi/aic7xxx/aic79xx.reg +++ b/drivers/scsi/aic7xxx/aic79xx.reg | |||
@@ -305,7 +305,7 @@ register HS_MAILBOX { | |||
305 | } | 305 | } |
306 | 306 | ||
307 | /* | 307 | /* |
308 | * Sequencer Interupt Status | 308 | * Sequencer Interrupt Status |
309 | */ | 309 | */ |
310 | register SEQINTSTAT { | 310 | register SEQINTSTAT { |
311 | address 0x00C | 311 | address 0x00C |
@@ -685,7 +685,7 @@ register DCHRXMSG0 { | |||
685 | } | 685 | } |
686 | 686 | ||
687 | /* | 687 | /* |
688 | * CMC Recieve Message 0 | 688 | * CMC Receive Message 0 |
689 | */ | 689 | */ |
690 | register CMCRXMSG0 { | 690 | register CMCRXMSG0 { |
691 | address 0x090 | 691 | address 0x090 |
@@ -696,7 +696,7 @@ register CMCRXMSG0 { | |||
696 | } | 696 | } |
697 | 697 | ||
698 | /* | 698 | /* |
699 | * Overlay Recieve Message 0 | 699 | * Overlay Receive Message 0 |
700 | */ | 700 | */ |
701 | register OVLYRXMSG0 { | 701 | register OVLYRXMSG0 { |
702 | address 0x090 | 702 | address 0x090 |
@@ -732,7 +732,7 @@ register DCHRXMSG1 { | |||
732 | } | 732 | } |
733 | 733 | ||
734 | /* | 734 | /* |
735 | * CMC Recieve Message 1 | 735 | * CMC Receive Message 1 |
736 | */ | 736 | */ |
737 | register CMCRXMSG1 { | 737 | register CMCRXMSG1 { |
738 | address 0x091 | 738 | address 0x091 |
@@ -742,7 +742,7 @@ register CMCRXMSG1 { | |||
742 | } | 742 | } |
743 | 743 | ||
744 | /* | 744 | /* |
745 | * Overlay Recieve Message 1 | 745 | * Overlay Receive Message 1 |
746 | */ | 746 | */ |
747 | register OVLYRXMSG1 { | 747 | register OVLYRXMSG1 { |
748 | address 0x091 | 748 | address 0x091 |
@@ -777,7 +777,7 @@ register DCHRXMSG2 { | |||
777 | } | 777 | } |
778 | 778 | ||
779 | /* | 779 | /* |
780 | * CMC Recieve Message 2 | 780 | * CMC Receive Message 2 |
781 | */ | 781 | */ |
782 | register CMCRXMSG2 { | 782 | register CMCRXMSG2 { |
783 | address 0x092 | 783 | address 0x092 |
@@ -787,7 +787,7 @@ register CMCRXMSG2 { | |||
787 | } | 787 | } |
788 | 788 | ||
789 | /* | 789 | /* |
790 | * Overlay Recieve Message 2 | 790 | * Overlay Receive Message 2 |
791 | */ | 791 | */ |
792 | register OVLYRXMSG2 { | 792 | register OVLYRXMSG2 { |
793 | address 0x092 | 793 | address 0x092 |
@@ -816,7 +816,7 @@ register DCHRXMSG3 { | |||
816 | } | 816 | } |
817 | 817 | ||
818 | /* | 818 | /* |
819 | * CMC Recieve Message 3 | 819 | * CMC Receive Message 3 |
820 | */ | 820 | */ |
821 | register CMCRXMSG3 { | 821 | register CMCRXMSG3 { |
822 | address 0x093 | 822 | address 0x093 |
@@ -826,7 +826,7 @@ register CMCRXMSG3 { | |||
826 | } | 826 | } |
827 | 827 | ||
828 | /* | 828 | /* |
829 | * Overlay Recieve Message 3 | 829 | * Overlay Receive Message 3 |
830 | */ | 830 | */ |
831 | register OVLYRXMSG3 { | 831 | register OVLYRXMSG3 { |
832 | address 0x093 | 832 | address 0x093 |
@@ -1249,7 +1249,7 @@ register TARGPCISTAT { | |||
1249 | 1249 | ||
1250 | /* | 1250 | /* |
1251 | * LQ Packet In | 1251 | * LQ Packet In |
1252 | * The last LQ Packet recieved | 1252 | * The last LQ Packet received |
1253 | */ | 1253 | */ |
1254 | register LQIN { | 1254 | register LQIN { |
1255 | address 0x020 | 1255 | address 0x020 |
@@ -2573,7 +2573,7 @@ register IOPDNCTL { | |||
2573 | } | 2573 | } |
2574 | 2574 | ||
2575 | /* | 2575 | /* |
2576 | * Shaddow Host Address. | 2576 | * Shadow Host Address. |
2577 | */ | 2577 | */ |
2578 | register SHADDR { | 2578 | register SHADDR { |
2579 | address 0x060 | 2579 | address 0x060 |
@@ -3983,7 +3983,7 @@ scratch_ram { | |||
3983 | 3983 | ||
3984 | /* | 3984 | /* |
3985 | * The maximum amount of time to wait, when interrupt coalescing | 3985 | * The maximum amount of time to wait, when interrupt coalescing |
3986 | * is enabled, before issueing a CMDCMPLT interrupt for a completed | 3986 | * is enabled, before issuing a CMDCMPLT interrupt for a completed |
3987 | * command. | 3987 | * command. |
3988 | */ | 3988 | */ |
3989 | INT_COALESCING_TIMER { | 3989 | INT_COALESCING_TIMER { |
diff --git a/drivers/scsi/aic7xxx/aic79xx.seq b/drivers/scsi/aic7xxx/aic79xx.seq index 2fb78e35a9e5..3a36d9362a10 100644 --- a/drivers/scsi/aic7xxx/aic79xx.seq +++ b/drivers/scsi/aic7xxx/aic79xx.seq | |||
@@ -567,7 +567,7 @@ BEGIN_CRITICAL; | |||
567 | shr SELOID, 4, SCB_SCSIID; | 567 | shr SELOID, 4, SCB_SCSIID; |
568 | /* | 568 | /* |
569 | * If we want to send a message to the device, ensure | 569 | * If we want to send a message to the device, ensure |
570 | * we are selecting with atn irregardless of our packetized | 570 | * we are selecting with atn regardless of our packetized |
571 | * agreement. Since SPI4 only allows target reset or PPR | 571 | * agreement. Since SPI4 only allows target reset or PPR |
572 | * messages if this is a packetized connection, the change | 572 | * messages if this is a packetized connection, the change |
573 | * to our negotiation table entry for this selection will | 573 | * to our negotiation table entry for this selection will |
@@ -960,7 +960,7 @@ p_status_okay: | |||
960 | * This is done to allow the host to send messages outside of an identify | 960 | * This is done to allow the host to send messages outside of an identify |
961 | * sequence while protecting the seqencer from testing the MK_MESSAGE bit | 961 | * sequence while protecting the seqencer from testing the MK_MESSAGE bit |
962 | * on an SCB that might not be for the current nexus. (For example, a | 962 | * on an SCB that might not be for the current nexus. (For example, a |
963 | * BDR message in responce to a bad reselection would leave us pointed to | 963 | * BDR message in response to a bad reselection would leave us pointed to |
964 | * an SCB that doesn't have anything to do with the current target). | 964 | * an SCB that doesn't have anything to do with the current target). |
965 | * | 965 | * |
966 | * Otherwise, treat MSG_OUT as a 1 byte message to send (abort, abort tag, | 966 | * Otherwise, treat MSG_OUT as a 1 byte message to send (abort, abort tag, |
@@ -1507,7 +1507,7 @@ service_fifo: | |||
1507 | * If the other FIFO needs loading, then it | 1507 | * If the other FIFO needs loading, then it |
1508 | * must not have claimed the S/G cache yet | 1508 | * must not have claimed the S/G cache yet |
1509 | * (SG_CACHE_AVAIL would have been cleared in | 1509 | * (SG_CACHE_AVAIL would have been cleared in |
1510 | * the orginal FIFO mode and we test this above). | 1510 | * the original FIFO mode and we test this above). |
1511 | * Return to the idle loop so we can process the | 1511 | * Return to the idle loop so we can process the |
1512 | * FIFO not currently on the bus first. | 1512 | * FIFO not currently on the bus first. |
1513 | */ | 1513 | */ |
@@ -1521,7 +1521,7 @@ idle_sgfetch_okay: | |||
1521 | idle_sgfetch_start: | 1521 | idle_sgfetch_start: |
1522 | /* | 1522 | /* |
1523 | * We fetch a "cacheline aligned" and sized amount of data | 1523 | * We fetch a "cacheline aligned" and sized amount of data |
1524 | * so we don't end up referencing a non-existant page. | 1524 | * so we don't end up referencing a non-existent page. |
1525 | * Cacheline aligned is in quotes because the kernel will | 1525 | * Cacheline aligned is in quotes because the kernel will |
1526 | * set the prefetch amount to a reasonable level if the | 1526 | * set the prefetch amount to a reasonable level if the |
1527 | * cacheline size is unknown. | 1527 | * cacheline size is unknown. |
@@ -1551,7 +1551,7 @@ idle_sg_avail: | |||
1551 | test DFSTATUS, PRELOAD_AVAIL jz return; | 1551 | test DFSTATUS, PRELOAD_AVAIL jz return; |
1552 | /* | 1552 | /* |
1553 | * On the A, preloading a segment before HDMAENACK | 1553 | * On the A, preloading a segment before HDMAENACK |
1554 | * comes true can clobber the shaddow address of the | 1554 | * comes true can clobber the shadow address of the |
1555 | * first segment in the S/G FIFO. Wait until it is | 1555 | * first segment in the S/G FIFO. Wait until it is |
1556 | * safe to proceed. | 1556 | * safe to proceed. |
1557 | */ | 1557 | */ |
@@ -2004,10 +2004,10 @@ pkt_handle_xfer: | |||
2004 | * Defer handling of this NONPACKREQ until we | 2004 | * Defer handling of this NONPACKREQ until we |
2005 | * can be sure it pertains to this FIFO. SAVEPTRS | 2005 | * can be sure it pertains to this FIFO. SAVEPTRS |
2006 | * will not be asserted if the NONPACKREQ is for us, | 2006 | * will not be asserted if the NONPACKREQ is for us, |
2007 | * so we must simulate it if shaddow is valid. If | 2007 | * so we must simulate it if shadow is valid. If |
2008 | * shaddow is not valid, keep running this FIFO until we | 2008 | * shadow is not valid, keep running this FIFO until we |
2009 | * have satisfied the transfer by loading segments and | 2009 | * have satisfied the transfer by loading segments and |
2010 | * waiting for either shaddow valid or last_seg_done. | 2010 | * waiting for either shadow valid or last_seg_done. |
2011 | */ | 2011 | */ |
2012 | test MDFFSTAT, SHVALID jnz pkt_saveptrs; | 2012 | test MDFFSTAT, SHVALID jnz pkt_saveptrs; |
2013 | pkt_service_fifo: | 2013 | pkt_service_fifo: |
@@ -2171,7 +2171,7 @@ pkt_status_check_nonpackreq: | |||
2171 | /* | 2171 | /* |
2172 | * The unexpected nonpkt phase handler assumes that any | 2172 | * The unexpected nonpkt phase handler assumes that any |
2173 | * data channel use will have a FIFO reference count. It | 2173 | * data channel use will have a FIFO reference count. It |
2174 | * turns out that the status handler doesn't need a refernce | 2174 | * turns out that the status handler doesn't need a references |
2175 | * count since the status received flag, and thus completion | 2175 | * count since the status received flag, and thus completion |
2176 | * processing, cannot be set until the handler is finished. | 2176 | * processing, cannot be set until the handler is finished. |
2177 | * We increment the count here to make the nonpkt handler | 2177 | * We increment the count here to make the nonpkt handler |
diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 3233bf564435..5f8617dd43bb 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c | |||
@@ -562,7 +562,7 @@ ahd_targetcmd_offset(struct ahd_softc *ahd, u_int index) | |||
562 | } | 562 | } |
563 | #endif | 563 | #endif |
564 | 564 | ||
565 | /*********************** Miscelaneous Support Functions ***********************/ | 565 | /*********************** Miscellaneous Support Functions ***********************/ |
566 | /* | 566 | /* |
567 | * Return pointers to the transfer negotiation information | 567 | * Return pointers to the transfer negotiation information |
568 | * for the specified our_id/remote_id pair. | 568 | * for the specified our_id/remote_id pair. |
@@ -599,7 +599,7 @@ void | |||
599 | ahd_outw(struct ahd_softc *ahd, u_int port, u_int value) | 599 | ahd_outw(struct ahd_softc *ahd, u_int port, u_int value) |
600 | { | 600 | { |
601 | /* | 601 | /* |
602 | * Write low byte first to accomodate registers | 602 | * Write low byte first to accommodate registers |
603 | * such as PRGMCNT where the order maters. | 603 | * such as PRGMCNT where the order maters. |
604 | */ | 604 | */ |
605 | ahd_outb(ahd, port, value & 0xFF); | 605 | ahd_outb(ahd, port, value & 0xFF); |
@@ -2067,7 +2067,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) | |||
2067 | * that requires host assistance for completion. | 2067 | * that requires host assistance for completion. |
2068 | * While handling the message phase(s), we will be | 2068 | * While handling the message phase(s), we will be |
2069 | * notified by the sequencer after each byte is | 2069 | * notified by the sequencer after each byte is |
2070 | * transfered so we can track bus phase changes. | 2070 | * transferred so we can track bus phase changes. |
2071 | * | 2071 | * |
2072 | * If this is the first time we've seen a HOST_MSG_LOOP | 2072 | * If this is the first time we've seen a HOST_MSG_LOOP |
2073 | * interrupt, initialize the state of the host message | 2073 | * interrupt, initialize the state of the host message |
@@ -2487,7 +2487,7 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) | |||
2487 | /* | 2487 | /* |
2488 | * Although the driver does not care about the | 2488 | * Although the driver does not care about the |
2489 | * 'Selection in Progress' status bit, the busy | 2489 | * 'Selection in Progress' status bit, the busy |
2490 | * LED does. SELINGO is only cleared by a successfull | 2490 | * LED does. SELINGO is only cleared by a successful |
2491 | * selection, so we must manually clear it to insure | 2491 | * selection, so we must manually clear it to insure |
2492 | * the LED turns off just incase no future successful | 2492 | * the LED turns off just incase no future successful |
2493 | * selections occur (e.g. no devices on the bus). | 2493 | * selections occur (e.g. no devices on the bus). |
@@ -3548,7 +3548,7 @@ ahd_clear_critical_section(struct ahd_softc *ahd) | |||
3548 | ahd_outb(ahd, SEQCTL0, ahd_inb(ahd, SEQCTL0) & ~STEP); | 3548 | ahd_outb(ahd, SEQCTL0, ahd_inb(ahd, SEQCTL0) & ~STEP); |
3549 | ahd_outb(ahd, SIMODE1, simode1); | 3549 | ahd_outb(ahd, SIMODE1, simode1); |
3550 | /* | 3550 | /* |
3551 | * SCSIINT seems to glitch occassionally when | 3551 | * SCSIINT seems to glitch occasionally when |
3552 | * the interrupt masks are restored. Clear SCSIINT | 3552 | * the interrupt masks are restored. Clear SCSIINT |
3553 | * one more time so that only persistent errors | 3553 | * one more time so that only persistent errors |
3554 | * are seen as a real interrupt. | 3554 | * are seen as a real interrupt. |
@@ -3838,7 +3838,7 @@ ahd_validate_width(struct ahd_softc *ahd, struct ahd_initiator_tinfo *tinfo, | |||
3838 | 3838 | ||
3839 | /* | 3839 | /* |
3840 | * Update the bitmask of targets for which the controller should | 3840 | * Update the bitmask of targets for which the controller should |
3841 | * negotiate with at the next convenient oportunity. This currently | 3841 | * negotiate with at the next convenient opportunity. This currently |
3842 | * means the next time we send the initial identify messages for | 3842 | * means the next time we send the initial identify messages for |
3843 | * a new transaction. | 3843 | * a new transaction. |
3844 | */ | 3844 | */ |
@@ -4200,7 +4200,7 @@ ahd_update_neg_table(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, | |||
4200 | 4200 | ||
4201 | /* | 4201 | /* |
4202 | * During packetized transfers, the target will | 4202 | * During packetized transfers, the target will |
4203 | * give us the oportunity to send command packets | 4203 | * give us the opportunity to send command packets |
4204 | * without us asserting attention. | 4204 | * without us asserting attention. |
4205 | */ | 4205 | */ |
4206 | if ((tinfo->ppr_options & MSG_EXT_PPR_IU_REQ) == 0) | 4206 | if ((tinfo->ppr_options & MSG_EXT_PPR_IU_REQ) == 0) |
@@ -5651,7 +5651,7 @@ ahd_handle_msg_reject(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) | |||
5651 | 5651 | ||
5652 | /* | 5652 | /* |
5653 | * Requeue all tagged commands for this target | 5653 | * Requeue all tagged commands for this target |
5654 | * currently in our posession so they can be | 5654 | * currently in our possession so they can be |
5655 | * converted to untagged commands. | 5655 | * converted to untagged commands. |
5656 | */ | 5656 | */ |
5657 | ahd_search_qinfifo(ahd, SCB_GET_TARGET(ahd, scb), | 5657 | ahd_search_qinfifo(ahd, SCB_GET_TARGET(ahd, scb), |
@@ -6245,7 +6245,7 @@ ahd_shutdown(void *arg) | |||
6245 | /* | 6245 | /* |
6246 | * Reset the controller and record some information about it | 6246 | * Reset the controller and record some information about it |
6247 | * that is only available just after a reset. If "reinit" is | 6247 | * that is only available just after a reset. If "reinit" is |
6248 | * non-zero, this reset occured after initial configuration | 6248 | * non-zero, this reset occurred after initial configuration |
6249 | * and the caller requests that the chip be fully reinitialized | 6249 | * and the caller requests that the chip be fully reinitialized |
6250 | * to a runable state. Chip interrupts are *not* enabled after | 6250 | * to a runable state. Chip interrupts are *not* enabled after |
6251 | * a reinitialization. The caller must enable interrupts via | 6251 | * a reinitialization. The caller must enable interrupts via |
@@ -6495,7 +6495,7 @@ ahd_init_scbdata(struct ahd_softc *ahd) | |||
6495 | } | 6495 | } |
6496 | 6496 | ||
6497 | /* | 6497 | /* |
6498 | * Note that we were successfull | 6498 | * Note that we were successful |
6499 | */ | 6499 | */ |
6500 | return (0); | 6500 | return (0); |
6501 | 6501 | ||
@@ -7079,7 +7079,7 @@ ahd_init(struct ahd_softc *ahd) | |||
7079 | return (ENOMEM); | 7079 | return (ENOMEM); |
7080 | 7080 | ||
7081 | /* | 7081 | /* |
7082 | * Verify that the compiler hasn't over-agressively | 7082 | * Verify that the compiler hasn't over-aggressively |
7083 | * padded important structures. | 7083 | * padded important structures. |
7084 | */ | 7084 | */ |
7085 | if (sizeof(struct hardware_scb) != 64) | 7085 | if (sizeof(struct hardware_scb) != 64) |
@@ -10087,7 +10087,7 @@ ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf, | |||
10087 | return (error); | 10087 | return (error); |
10088 | 10088 | ||
10089 | /* | 10089 | /* |
10090 | * Write the data. If we don't get throught the loop at | 10090 | * Write the data. If we don't get through the loop at |
10091 | * least once, the arguments were invalid. | 10091 | * least once, the arguments were invalid. |
10092 | */ | 10092 | */ |
10093 | retval = EINVAL; | 10093 | retval = EINVAL; |
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index 25d066624476..7d48700257a7 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c | |||
@@ -1441,7 +1441,7 @@ ahd_platform_set_tags(struct ahd_softc *ahd, struct scsi_device *sdev, | |||
1441 | usertags = ahd_linux_user_tagdepth(ahd, devinfo); | 1441 | usertags = ahd_linux_user_tagdepth(ahd, devinfo); |
1442 | if (!was_queuing) { | 1442 | if (!was_queuing) { |
1443 | /* | 1443 | /* |
1444 | * Start out agressively and allow our | 1444 | * Start out aggressively and allow our |
1445 | * dynamic queue depth algorithm to take | 1445 | * dynamic queue depth algorithm to take |
1446 | * care of the rest. | 1446 | * care of the rest. |
1447 | */ | 1447 | */ |
diff --git a/drivers/scsi/aic7xxx/aic7xxx.h b/drivers/scsi/aic7xxx/aic7xxx.h index 17444bc18bca..f695774645c1 100644 --- a/drivers/scsi/aic7xxx/aic7xxx.h +++ b/drivers/scsi/aic7xxx/aic7xxx.h | |||
@@ -440,7 +440,7 @@ struct hardware_scb { | |||
440 | * o A residual has occurred if SG_FULL_RESID is set in sgptr, | 440 | * o A residual has occurred if SG_FULL_RESID is set in sgptr, |
441 | * or residual_sgptr does not have SG_LIST_NULL set. | 441 | * or residual_sgptr does not have SG_LIST_NULL set. |
442 | * | 442 | * |
443 | * o We are transfering the last segment if residual_datacnt has | 443 | * o We are transferring the last segment if residual_datacnt has |
444 | * the SG_LAST_SEG flag set. | 444 | * the SG_LAST_SEG flag set. |
445 | * | 445 | * |
446 | * Host: | 446 | * Host: |
@@ -494,7 +494,7 @@ struct hardware_scb { | |||
494 | */ | 494 | */ |
495 | 495 | ||
496 | /* | 496 | /* |
497 | * Definition of a scatter/gather element as transfered to the controller. | 497 | * Definition of a scatter/gather element as transferred to the controller. |
498 | * The aic7xxx chips only support a 24bit length. We use the top byte of | 498 | * The aic7xxx chips only support a 24bit length. We use the top byte of |
499 | * the length to store additional address bits and a flag to indicate | 499 | * the length to store additional address bits and a flag to indicate |
500 | * that a given segment terminates the transfer. This gives us an | 500 | * that a given segment terminates the transfer. This gives us an |
diff --git a/drivers/scsi/aic7xxx/aic7xxx.reg b/drivers/scsi/aic7xxx/aic7xxx.reg index 9a96e55da39a..ba0b411d03e2 100644 --- a/drivers/scsi/aic7xxx/aic7xxx.reg +++ b/drivers/scsi/aic7xxx/aic7xxx.reg | |||
@@ -351,7 +351,7 @@ register SSTAT2 { | |||
351 | address 0x00d | 351 | address 0x00d |
352 | access_mode RO | 352 | access_mode RO |
353 | field OVERRUN 0x80 | 353 | field OVERRUN 0x80 |
354 | field SHVALID 0x40 /* Shaddow Layer non-zero */ | 354 | field SHVALID 0x40 /* Shadow Layer non-zero */ |
355 | field EXP_ACTIVE 0x10 /* SCSI Expander Active */ | 355 | field EXP_ACTIVE 0x10 /* SCSI Expander Active */ |
356 | field CRCVALERR 0x08 /* CRC doesn't match (U3 only) */ | 356 | field CRCVALERR 0x08 /* CRC doesn't match (U3 only) */ |
357 | field CRCENDERR 0x04 /* No terminal CRC packet (U3 only) */ | 357 | field CRCENDERR 0x04 /* No terminal CRC packet (U3 only) */ |
diff --git a/drivers/scsi/aic7xxx/aic7xxx.seq b/drivers/scsi/aic7xxx/aic7xxx.seq index 5a4cfc954a9f..e60041e8f2d1 100644 --- a/drivers/scsi/aic7xxx/aic7xxx.seq +++ b/drivers/scsi/aic7xxx/aic7xxx.seq | |||
@@ -57,10 +57,10 @@ PREFIX = "ahc_" | |||
57 | * a later time. This problem cannot be resolved by holding a single entry | 57 | * a later time. This problem cannot be resolved by holding a single entry |
58 | * in scratch ram since a reconnecting target can request sense and this will | 58 | * in scratch ram since a reconnecting target can request sense and this will |
59 | * create yet another SCB waiting for selection. The solution used here is to | 59 | * create yet another SCB waiting for selection. The solution used here is to |
60 | * use byte 27 of the SCB as a psuedo-next pointer and to thread a list | 60 | * use byte 27 of the SCB as a pseudo-next pointer and to thread a list |
61 | * of SCBs that are awaiting selection. Since 0-0xfe are valid SCB indexes, | 61 | * of SCBs that are awaiting selection. Since 0-0xfe are valid SCB indexes, |
62 | * SCB_LIST_NULL is 0xff which is out of range. An entry is also added to | 62 | * SCB_LIST_NULL is 0xff which is out of range. An entry is also added to |
63 | * this list everytime a request sense occurs or after completing a non-tagged | 63 | * this list every time a request sense occurs or after completing a non-tagged |
64 | * command for which a second SCB has been queued. The sequencer will | 64 | * command for which a second SCB has been queued. The sequencer will |
65 | * automatically consume the entries. | 65 | * automatically consume the entries. |
66 | */ | 66 | */ |
@@ -752,7 +752,7 @@ idle_loop: | |||
752 | 752 | ||
753 | /* | 753 | /* |
754 | * We fetch a "cacheline aligned" and sized amount of data | 754 | * We fetch a "cacheline aligned" and sized amount of data |
755 | * so we don't end up referencing a non-existant page. | 755 | * so we don't end up referencing a non-existent page. |
756 | * Cacheline aligned is in quotes because the kernel will | 756 | * Cacheline aligned is in quotes because the kernel will |
757 | * set the prefetch amount to a reasonable level if the | 757 | * set the prefetch amount to a reasonable level if the |
758 | * cacheline size is unknown. | 758 | * cacheline size is unknown. |
@@ -1485,7 +1485,7 @@ p_status_okay: | |||
1485 | * This is done to allow the host to send messages outside of an identify | 1485 | * This is done to allow the host to send messages outside of an identify |
1486 | * sequence while protecting the seqencer from testing the MK_MESSAGE bit | 1486 | * sequence while protecting the seqencer from testing the MK_MESSAGE bit |
1487 | * on an SCB that might not be for the current nexus. (For example, a | 1487 | * on an SCB that might not be for the current nexus. (For example, a |
1488 | * BDR message in responce to a bad reselection would leave us pointed to | 1488 | * BDR message in response to a bad reselection would leave us pointed to |
1489 | * an SCB that doesn't have anything to do with the current target). | 1489 | * an SCB that doesn't have anything to do with the current target). |
1490 | * | 1490 | * |
1491 | * Otherwise, treat MSG_OUT as a 1 byte message to send (abort, abort tag, | 1491 | * Otherwise, treat MSG_OUT as a 1 byte message to send (abort, abort tag, |
@@ -1999,7 +1999,7 @@ if ((ahc->flags & AHC_TARGETROLE) != 0) { | |||
1999 | * from out to in, wait an additional data release delay before continuing. | 1999 | * from out to in, wait an additional data release delay before continuing. |
2000 | */ | 2000 | */ |
2001 | change_phase: | 2001 | change_phase: |
2002 | /* Wait for preceeding I/O session to complete. */ | 2002 | /* Wait for preceding I/O session to complete. */ |
2003 | test SCSISIGI, ACKI jnz .; | 2003 | test SCSISIGI, ACKI jnz .; |
2004 | 2004 | ||
2005 | /* Change the phase */ | 2005 | /* Change the phase */ |
diff --git a/drivers/scsi/aic7xxx/aic7xxx_core.c b/drivers/scsi/aic7xxx/aic7xxx_core.c index e021b4812d58..dc28b0a91b22 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_core.c +++ b/drivers/scsi/aic7xxx/aic7xxx_core.c | |||
@@ -427,7 +427,7 @@ ahc_targetcmd_offset(struct ahc_softc *ahc, u_int index) | |||
427 | } | 427 | } |
428 | #endif | 428 | #endif |
429 | 429 | ||
430 | /*********************** Miscelaneous Support Functions ***********************/ | 430 | /*********************** Miscellaneous Support Functions ***********************/ |
431 | /* | 431 | /* |
432 | * Determine whether the sequencer reported a residual | 432 | * Determine whether the sequencer reported a residual |
433 | * for this SCB/transaction. | 433 | * for this SCB/transaction. |
@@ -1243,7 +1243,7 @@ ahc_handle_seqint(struct ahc_softc *ahc, u_int intstat) | |||
1243 | * that requires host assistance for completion. | 1243 | * that requires host assistance for completion. |
1244 | * While handling the message phase(s), we will be | 1244 | * While handling the message phase(s), we will be |
1245 | * notified by the sequencer after each byte is | 1245 | * notified by the sequencer after each byte is |
1246 | * transfered so we can track bus phase changes. | 1246 | * transferred so we can track bus phase changes. |
1247 | * | 1247 | * |
1248 | * If this is the first time we've seen a HOST_MSG_LOOP | 1248 | * If this is the first time we've seen a HOST_MSG_LOOP |
1249 | * interrupt, initialize the state of the host message | 1249 | * interrupt, initialize the state of the host message |
@@ -1487,7 +1487,7 @@ ahc_handle_seqint(struct ahc_softc *ahc, u_int intstat) | |||
1487 | scbptr, ahc_inb(ahc, ARG_1), | 1487 | scbptr, ahc_inb(ahc, ARG_1), |
1488 | ahc->scb_data->hscbs[scbptr].tag); | 1488 | ahc->scb_data->hscbs[scbptr].tag); |
1489 | ahc_dump_card_state(ahc); | 1489 | ahc_dump_card_state(ahc); |
1490 | panic("for saftey"); | 1490 | panic("for safety"); |
1491 | break; | 1491 | break; |
1492 | } | 1492 | } |
1493 | case OUT_OF_RANGE: | 1493 | case OUT_OF_RANGE: |
@@ -1733,7 +1733,7 @@ ahc_handle_scsiint(struct ahc_softc *ahc, u_int intstat) | |||
1733 | /* | 1733 | /* |
1734 | * Although the driver does not care about the | 1734 | * Although the driver does not care about the |
1735 | * 'Selection in Progress' status bit, the busy | 1735 | * 'Selection in Progress' status bit, the busy |
1736 | * LED does. SELINGO is only cleared by a successfull | 1736 | * LED does. SELINGO is only cleared by a successful |
1737 | * selection, so we must manually clear it to insure | 1737 | * selection, so we must manually clear it to insure |
1738 | * the LED turns off just incase no future successful | 1738 | * the LED turns off just incase no future successful |
1739 | * selections occur (e.g. no devices on the bus). | 1739 | * selections occur (e.g. no devices on the bus). |
@@ -1943,7 +1943,7 @@ ahc_handle_scsiint(struct ahc_softc *ahc, u_int intstat) | |||
1943 | if (lastphase != P_BUSFREE) { | 1943 | if (lastphase != P_BUSFREE) { |
1944 | /* | 1944 | /* |
1945 | * Renegotiate with this device at the | 1945 | * Renegotiate with this device at the |
1946 | * next oportunity just in case this busfree | 1946 | * next opportunity just in case this busfree |
1947 | * is due to a negotiation mismatch with the | 1947 | * is due to a negotiation mismatch with the |
1948 | * device. | 1948 | * device. |
1949 | */ | 1949 | */ |
@@ -2442,7 +2442,7 @@ ahc_validate_width(struct ahc_softc *ahc, struct ahc_initiator_tinfo *tinfo, | |||
2442 | 2442 | ||
2443 | /* | 2443 | /* |
2444 | * Update the bitmask of targets for which the controller should | 2444 | * Update the bitmask of targets for which the controller should |
2445 | * negotiate with at the next convenient oportunity. This currently | 2445 | * negotiate with at the next convenient opportunity. This currently |
2446 | * means the next time we send the initial identify messages for | 2446 | * means the next time we send the initial identify messages for |
2447 | * a new transaction. | 2447 | * a new transaction. |
2448 | */ | 2448 | */ |
@@ -4131,7 +4131,7 @@ ahc_handle_msg_reject(struct ahc_softc *ahc, struct ahc_devinfo *devinfo) | |||
4131 | 4131 | ||
4132 | /* | 4132 | /* |
4133 | * Requeue all tagged commands for this target | 4133 | * Requeue all tagged commands for this target |
4134 | * currently in our posession so they can be | 4134 | * currently in our possession so they can be |
4135 | * converted to untagged commands. | 4135 | * converted to untagged commands. |
4136 | */ | 4136 | */ |
4137 | ahc_search_qinfifo(ahc, SCB_GET_TARGET(ahc, scb), | 4137 | ahc_search_qinfifo(ahc, SCB_GET_TARGET(ahc, scb), |
@@ -4581,7 +4581,7 @@ ahc_shutdown(void *arg) | |||
4581 | /* | 4581 | /* |
4582 | * Reset the controller and record some information about it | 4582 | * Reset the controller and record some information about it |
4583 | * that is only available just after a reset. If "reinit" is | 4583 | * that is only available just after a reset. If "reinit" is |
4584 | * non-zero, this reset occured after initial configuration | 4584 | * non-zero, this reset occurred after initial configuration |
4585 | * and the caller requests that the chip be fully reinitialized | 4585 | * and the caller requests that the chip be fully reinitialized |
4586 | * to a runable state. Chip interrupts are *not* enabled after | 4586 | * to a runable state. Chip interrupts are *not* enabled after |
4587 | * a reinitialization. The caller must enable interrupts via | 4587 | * a reinitialization. The caller must enable interrupts via |
@@ -4899,7 +4899,7 @@ ahc_init_scbdata(struct ahc_softc *ahc) | |||
4899 | ahc->next_queued_scb = ahc_get_scb(ahc); | 4899 | ahc->next_queued_scb = ahc_get_scb(ahc); |
4900 | 4900 | ||
4901 | /* | 4901 | /* |
4902 | * Note that we were successfull | 4902 | * Note that we were successful |
4903 | */ | 4903 | */ |
4904 | return (0); | 4904 | return (0); |
4905 | 4905 | ||
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c index 4a359bb307c6..c6251bb4f438 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c | |||
@@ -294,7 +294,7 @@ static uint32_t aic7xxx_extended; | |||
294 | * dubious at best. To my knowledge, this option has never actually | 294 | * dubious at best. To my knowledge, this option has never actually |
295 | * solved a PCI parity problem, but on certain machines with broken PCI | 295 | * solved a PCI parity problem, but on certain machines with broken PCI |
296 | * chipset configurations where stray PCI transactions with bad parity are | 296 | * chipset configurations where stray PCI transactions with bad parity are |
297 | * the norm rather than the exception, the error messages can be overwelming. | 297 | * the norm rather than the exception, the error messages can be overwhelming. |
298 | * It's included in the driver for completeness. | 298 | * It's included in the driver for completeness. |
299 | * 0 = Shut off PCI parity check | 299 | * 0 = Shut off PCI parity check |
300 | * non-0 = reverse polarity pci parity checking | 300 | * non-0 = reverse polarity pci parity checking |
@@ -1318,7 +1318,7 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, | |||
1318 | usertags = ahc_linux_user_tagdepth(ahc, devinfo); | 1318 | usertags = ahc_linux_user_tagdepth(ahc, devinfo); |
1319 | if (!was_queuing) { | 1319 | if (!was_queuing) { |
1320 | /* | 1320 | /* |
1321 | * Start out agressively and allow our | 1321 | * Start out aggressively and allow our |
1322 | * dynamic queue depth algorithm to take | 1322 | * dynamic queue depth algorithm to take |
1323 | * care of the rest. | 1323 | * care of the rest. |
1324 | */ | 1324 | */ |
diff --git a/drivers/scsi/aic7xxx/aic7xxx_pci.c b/drivers/scsi/aic7xxx/aic7xxx_pci.c index 2b11a4272364..6917b4f5ac9e 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_pci.c +++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c | |||
@@ -789,7 +789,7 @@ ahc_pci_config(struct ahc_softc *ahc, const struct ahc_pci_identity *entry) | |||
789 | ahc->bus_intr = ahc_pci_intr; | 789 | ahc->bus_intr = ahc_pci_intr; |
790 | ahc->bus_chip_init = ahc_pci_chip_init; | 790 | ahc->bus_chip_init = ahc_pci_chip_init; |
791 | 791 | ||
792 | /* Remeber how the card was setup in case there is no SEEPROM */ | 792 | /* Remember how the card was setup in case there is no SEEPROM */ |
793 | if ((ahc_inb(ahc, HCNTRL) & POWRDN) == 0) { | 793 | if ((ahc_inb(ahc, HCNTRL) & POWRDN) == 0) { |
794 | ahc_pause(ahc); | 794 | ahc_pause(ahc); |
795 | if ((ahc->features & AHC_ULTRA2) != 0) | 795 | if ((ahc->features & AHC_ULTRA2) != 0) |
@@ -860,7 +860,7 @@ ahc_pci_config(struct ahc_softc *ahc, const struct ahc_pci_identity *entry) | |||
860 | } | 860 | } |
861 | 861 | ||
862 | /* | 862 | /* |
863 | * We cannot perform ULTRA speeds without the presense | 863 | * We cannot perform ULTRA speeds without the presence |
864 | * of the external precision resistor. | 864 | * of the external precision resistor. |
865 | */ | 865 | */ |
866 | if ((ahc->features & AHC_ULTRA) != 0) { | 866 | if ((ahc->features & AHC_ULTRA) != 0) { |
@@ -969,7 +969,7 @@ ahc_pci_config(struct ahc_softc *ahc, const struct ahc_pci_identity *entry) | |||
969 | } | 969 | } |
970 | 970 | ||
971 | /* | 971 | /* |
972 | * Test for the presense of external sram in an | 972 | * Test for the presence of external sram in an |
973 | * "unshared" configuration. | 973 | * "unshared" configuration. |
974 | */ | 974 | */ |
975 | static int | 975 | static int |
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y index e4064433842e..f1586a437906 100644 --- a/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y +++ b/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y | |||
@@ -803,7 +803,7 @@ macro_arglist: | |||
803 | | macro_arglist ',' T_ARG | 803 | | macro_arglist ',' T_ARG |
804 | { | 804 | { |
805 | if ($1 == 0) { | 805 | if ($1 == 0) { |
806 | stop("Comma without preceeding argument in arg list", | 806 | stop("Comma without preceding argument in arg list", |
807 | EX_DATAERR); | 807 | EX_DATAERR); |
808 | /* NOTREACHED */ | 808 | /* NOTREACHED */ |
809 | } | 809 | } |
@@ -1319,8 +1319,8 @@ code: | |||
1319 | ; | 1319 | ; |
1320 | 1320 | ||
1321 | /* | 1321 | /* |
1322 | * This grammer differs from the one in the aic7xxx | 1322 | * This grammar differs from the one in the aic7xxx |
1323 | * reference manual since the grammer listed there is | 1323 | * reference manual since the grammar listed there is |
1324 | * ambiguous and causes a shift/reduce conflict. | 1324 | * ambiguous and causes a shift/reduce conflict. |
1325 | * It also seems more logical as the "immediate" | 1325 | * It also seems more logical as the "immediate" |
1326 | * argument is listed as the second arg like the | 1326 | * argument is listed as the second arg like the |
@@ -1799,7 +1799,7 @@ format_3_instr(int opcode, symbol_ref_t *src, | |||
1799 | instr = seq_alloc(); | 1799 | instr = seq_alloc(); |
1800 | f3_instr = &instr->format.format3; | 1800 | f3_instr = &instr->format.format3; |
1801 | if (address->symbol == NULL) { | 1801 | if (address->symbol == NULL) { |
1802 | /* 'dot' referrence. Use the current instruction pointer */ | 1802 | /* 'dot' reference. Use the current instruction pointer */ |
1803 | addr = instruction_ptr + address->offset; | 1803 | addr = instruction_ptr + address->offset; |
1804 | } else if (address->symbol->type == UNINITIALIZED) { | 1804 | } else if (address->symbol->type == UNINITIALIZED) { |
1805 | /* forward reference */ | 1805 | /* forward reference */ |
diff --git a/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y b/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y index ff46aa6801bf..708326df0766 100644 --- a/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y +++ b/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y | |||
@@ -115,7 +115,7 @@ macro_arglist: | |||
115 | | macro_arglist ',' T_ARG | 115 | | macro_arglist ',' T_ARG |
116 | { | 116 | { |
117 | if ($1 == 0) { | 117 | if ($1 == 0) { |
118 | stop("Comma without preceeding argument in arg list", | 118 | stop("Comma without preceding argument in arg list", |
119 | EX_DATAERR); | 119 | EX_DATAERR); |
120 | /* NOTREACHED */ | 120 | /* NOTREACHED */ |
121 | } | 121 | } |
diff --git a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c index 4ff60a08df0f..5b212f0df898 100644 --- a/drivers/scsi/aic7xxx_old.c +++ b/drivers/scsi/aic7xxx_old.c | |||
@@ -905,7 +905,7 @@ struct aic_dev_data { | |||
905 | * problems with architectures I can't test on (because I don't have one, | 905 | * problems with architectures I can't test on (because I don't have one, |
906 | * such as the Alpha based systems) which happen to give faults for | 906 | * such as the Alpha based systems) which happen to give faults for |
907 | * non-aligned memory accesses, care was taken to align this structure | 907 | * non-aligned memory accesses, care was taken to align this structure |
908 | * in a way that gauranteed all accesses larger than 8 bits were aligned | 908 | * in a way that guaranteed all accesses larger than 8 bits were aligned |
909 | * on the appropriate boundary. It's also organized to try and be more | 909 | * on the appropriate boundary. It's also organized to try and be more |
910 | * cache line efficient. Be careful when changing this lest you might hurt | 910 | * cache line efficient. Be careful when changing this lest you might hurt |
911 | * overall performance and bring down the wrath of the masses. | 911 | * overall performance and bring down the wrath of the masses. |
@@ -1180,7 +1180,7 @@ static int aic7xxx_pci_parity = 0; | |||
1180 | * the card's registers in a hex dump format tailored to each model of | 1180 | * the card's registers in a hex dump format tailored to each model of |
1181 | * controller. | 1181 | * controller. |
1182 | * | 1182 | * |
1183 | * NOTE: THE CONTROLLER IS LEFT IN AN UNUSEABLE STATE BY THIS OPTION. | 1183 | * NOTE: THE CONTROLLER IS LEFT IN AN UNUSABLE STATE BY THIS OPTION. |
1184 | * YOU CANNOT BOOT UP WITH THIS OPTION, IT IS FOR DEBUGGING PURPOSES | 1184 | * YOU CANNOT BOOT UP WITH THIS OPTION, IT IS FOR DEBUGGING PURPOSES |
1185 | * ONLY | 1185 | * ONLY |
1186 | */ | 1186 | */ |
@@ -3467,7 +3467,7 @@ aic7xxx_reset_current_bus(struct aic7xxx_host *p) | |||
3467 | /* Turn off the bus' current operations, after all, we shouldn't have any | 3467 | /* Turn off the bus' current operations, after all, we shouldn't have any |
3468 | * valid commands left to cause a RSELI and SELO once we've tossed the | 3468 | * valid commands left to cause a RSELI and SELO once we've tossed the |
3469 | * bus away with this reset, so we might as well shut down the sequencer | 3469 | * bus away with this reset, so we might as well shut down the sequencer |
3470 | * until the bus is restarted as oppossed to saving the current settings | 3470 | * until the bus is restarted as opposed to saving the current settings |
3471 | * and restoring them (which makes no sense to me). */ | 3471 | * and restoring them (which makes no sense to me). */ |
3472 | 3472 | ||
3473 | /* Turn on the bus reset. */ | 3473 | /* Turn on the bus reset. */ |
@@ -4070,7 +4070,7 @@ aic7xxx_handle_seqint(struct aic7xxx_host *p, unsigned char intstat) | |||
4070 | aic_dev->max_q_depth = aic_dev->temp_q_depth = 1; | 4070 | aic_dev->max_q_depth = aic_dev->temp_q_depth = 1; |
4071 | /* | 4071 | /* |
4072 | * We set this command up as a bus device reset. However, we have | 4072 | * We set this command up as a bus device reset. However, we have |
4073 | * to clear the tag type as it's causing us problems. We shouldnt | 4073 | * to clear the tag type as it's causing us problems. We shouldn't |
4074 | * have to worry about any other commands being active, since if | 4074 | * have to worry about any other commands being active, since if |
4075 | * the device is refusing tagged commands, this should be the | 4075 | * the device is refusing tagged commands, this should be the |
4076 | * first tagged command sent to the device, however, we do have | 4076 | * first tagged command sent to the device, however, we do have |
@@ -9748,7 +9748,7 @@ skip_pci_controller: | |||
9748 | } | 9748 | } |
9749 | 9749 | ||
9750 | /* | 9750 | /* |
9751 | * We are commited now, everything has been checked and this card | 9751 | * We are committed now, everything has been checked and this card |
9752 | * has been found, now we just set it up | 9752 | * has been found, now we just set it up |
9753 | */ | 9753 | */ |
9754 | 9754 | ||
@@ -9906,7 +9906,7 @@ skip_pci_controller: | |||
9906 | * 2: All PCI controllers with BIOS_ENABLED next, according to BIOS | 9906 | * 2: All PCI controllers with BIOS_ENABLED next, according to BIOS |
9907 | * address, going from lowest to highest. | 9907 | * address, going from lowest to highest. |
9908 | * 3: Remaining VLB/EISA controllers going in slot order. | 9908 | * 3: Remaining VLB/EISA controllers going in slot order. |
9909 | * 4: Remaining PCI controllers, going in PCI device order (reversable) | 9909 | * 4: Remaining PCI controllers, going in PCI device order (reversible) |
9910 | */ | 9910 | */ |
9911 | 9911 | ||
9912 | { | 9912 | { |
diff --git a/drivers/scsi/aic7xxx_old/aic7xxx.seq b/drivers/scsi/aic7xxx_old/aic7xxx.seq index 1565be9ebd49..823ff2873229 100644 --- a/drivers/scsi/aic7xxx_old/aic7xxx.seq +++ b/drivers/scsi/aic7xxx_old/aic7xxx.seq | |||
@@ -51,7 +51,7 @@ | |||
51 | * use byte 27 of the SCB as a pseudo-next pointer and to thread a list | 51 | * use byte 27 of the SCB as a pseudo-next pointer and to thread a list |
52 | * of SCBs that are awaiting selection. Since 0-0xfe are valid SCB indexes, | 52 | * of SCBs that are awaiting selection. Since 0-0xfe are valid SCB indexes, |
53 | * SCB_LIST_NULL is 0xff which is out of range. An entry is also added to | 53 | * SCB_LIST_NULL is 0xff which is out of range. An entry is also added to |
54 | * this list everytime a request sense occurs or after completing a non-tagged | 54 | * this list every time a request sense occurs or after completing a non-tagged |
55 | * command for which a second SCB has been queued. The sequencer will | 55 | * command for which a second SCB has been queued. The sequencer will |
56 | * automatically consume the entries. | 56 | * automatically consume the entries. |
57 | */ | 57 | */ |
@@ -696,7 +696,7 @@ p_status: | |||
696 | * This is done to allow the hsot to send messages outside of an identify | 696 | * This is done to allow the hsot to send messages outside of an identify |
697 | * sequence while protecting the seqencer from testing the MK_MESSAGE bit | 697 | * sequence while protecting the seqencer from testing the MK_MESSAGE bit |
698 | * on an SCB that might not be for the current nexus. (For example, a | 698 | * on an SCB that might not be for the current nexus. (For example, a |
699 | * BDR message in responce to a bad reselection would leave us pointed to | 699 | * BDR message in response to a bad reselection would leave us pointed to |
700 | * an SCB that doesn't have anything to do with the current target). | 700 | * an SCB that doesn't have anything to do with the current target). |
701 | * Otherwise, treat MSG_OUT as a 1 byte message to send (abort, abort tag, | 701 | * Otherwise, treat MSG_OUT as a 1 byte message to send (abort, abort tag, |
702 | * bus device reset). | 702 | * bus device reset). |
@@ -716,8 +716,8 @@ p_mesgout_identify: | |||
716 | } else { | 716 | } else { |
717 | and SINDEX,0x7,SCB_TCL; /* lun */ | 717 | and SINDEX,0x7,SCB_TCL; /* lun */ |
718 | } | 718 | } |
719 | and A,DISCENB,SCB_CONTROL; /* mask off disconnect privledge */ | 719 | and A,DISCENB,SCB_CONTROL; /* mask off disconnect privilege */ |
720 | or SINDEX,A; /* or in disconnect privledge */ | 720 | or SINDEX,A; /* or in disconnect privilege */ |
721 | or SINDEX,MSG_IDENTIFYFLAG; | 721 | or SINDEX,MSG_IDENTIFYFLAG; |
722 | p_mesgout_mk_message: | 722 | p_mesgout_mk_message: |
723 | test SCB_CONTROL,MK_MESSAGE jz p_mesgout_tag; | 723 | test SCB_CONTROL,MK_MESSAGE jz p_mesgout_tag; |
diff --git a/drivers/scsi/aic94xx/Makefile b/drivers/scsi/aic94xx/Makefile index e78ce0fa44d2..c0a15c754585 100644 --- a/drivers/scsi/aic94xx/Makefile +++ b/drivers/scsi/aic94xx/Makefile | |||
@@ -22,9 +22,7 @@ | |||
22 | # along with the aic94xx driver; if not, write to the Free Software | 22 | # along with the aic94xx driver; if not, write to the Free Software |
23 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 23 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
24 | 24 | ||
25 | ifeq ($(CONFIG_AIC94XX_DEBUG),y) | 25 | ccflags-$(CONFIG_AIC94XX_DEBUG) := -DASD_DEBUG -DASD_ENTER_EXIT |
26 | EXTRA_CFLAGS += -DASD_DEBUG -DASD_ENTER_EXIT | ||
27 | endif | ||
28 | 26 | ||
29 | obj-$(CONFIG_SCSI_AIC94XX) += aic94xx.o | 27 | obj-$(CONFIG_SCSI_AIC94XX) += aic94xx.o |
30 | aic94xx-y += aic94xx_init.o \ | 28 | aic94xx-y += aic94xx_init.o \ |
diff --git a/drivers/scsi/aic94xx/aic94xx_reg_def.h b/drivers/scsi/aic94xx/aic94xx_reg_def.h index 40273a747d29..dd6cc8008b16 100644 --- a/drivers/scsi/aic94xx/aic94xx_reg_def.h +++ b/drivers/scsi/aic94xx/aic94xx_reg_def.h | |||
@@ -2134,7 +2134,7 @@ | |||
2134 | * The host accesses this scratch in a different manner from the | 2134 | * The host accesses this scratch in a different manner from the |
2135 | * link sequencer. The sequencer has to use LSEQ registers | 2135 | * link sequencer. The sequencer has to use LSEQ registers |
2136 | * LmSCRPAGE and LmMnSCRPAGE to access the scratch memory. A flat | 2136 | * LmSCRPAGE and LmMnSCRPAGE to access the scratch memory. A flat |
2137 | * mapping of the scratch memory is avaliable for software | 2137 | * mapping of the scratch memory is available for software |
2138 | * convenience and to prevent corruption while the sequencer is | 2138 | * convenience and to prevent corruption while the sequencer is |
2139 | * running. This memory is mapped onto addresses 800h - 9FFh. | 2139 | * running. This memory is mapped onto addresses 800h - 9FFh. |
2140 | * | 2140 | * |
diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c index ec166726b314..c454e44cf51c 100644 --- a/drivers/scsi/arm/acornscsi.c +++ b/drivers/scsi/arm/acornscsi.c | |||
@@ -100,7 +100,7 @@ | |||
100 | */ | 100 | */ |
101 | #define TIMEOUT_TIME 10 | 101 | #define TIMEOUT_TIME 10 |
102 | /* | 102 | /* |
103 | * Define this if you want to have verbose explaination of SCSI | 103 | * Define this if you want to have verbose explanation of SCSI |
104 | * status/messages. | 104 | * status/messages. |
105 | */ | 105 | */ |
106 | #undef CONFIG_ACORNSCSI_CONSTANTS | 106 | #undef CONFIG_ACORNSCSI_CONSTANTS |
@@ -1561,7 +1561,7 @@ void acornscsi_message(AS_Host *host) | |||
1561 | /* | 1561 | /* |
1562 | * If we were negociating sync transfer, we don't yet know if | 1562 | * If we were negociating sync transfer, we don't yet know if |
1563 | * this REJECT is for the sync transfer or for the tagged queue/wide | 1563 | * this REJECT is for the sync transfer or for the tagged queue/wide |
1564 | * transfer. Re-initiate sync transfer negociation now, and if | 1564 | * transfer. Re-initiate sync transfer negotiation now, and if |
1565 | * we got a REJECT in response to SDTR, then it'll be set to DONE. | 1565 | * we got a REJECT in response to SDTR, then it'll be set to DONE. |
1566 | */ | 1566 | */ |
1567 | if (host->device[host->SCpnt->device->id].sync_state == SYNC_SENT_REQUEST) | 1567 | if (host->device[host->SCpnt->device->id].sync_state == SYNC_SENT_REQUEST) |
diff --git a/drivers/scsi/arm/acornscsi.h b/drivers/scsi/arm/acornscsi.h index 8d2172a0b351..01bc715a3aec 100644 --- a/drivers/scsi/arm/acornscsi.h +++ b/drivers/scsi/arm/acornscsi.h | |||
@@ -223,8 +223,8 @@ typedef enum { | |||
223 | * Synchronous transfer state | 223 | * Synchronous transfer state |
224 | */ | 224 | */ |
225 | typedef enum { /* Synchronous transfer state */ | 225 | typedef enum { /* Synchronous transfer state */ |
226 | SYNC_ASYNCHRONOUS, /* don't negociate synchronous transfers*/ | 226 | SYNC_ASYNCHRONOUS, /* don't negotiate synchronous transfers*/ |
227 | SYNC_NEGOCIATE, /* start negociation */ | 227 | SYNC_NEGOCIATE, /* start negotiation */ |
228 | SYNC_SENT_REQUEST, /* sent SDTR message */ | 228 | SYNC_SENT_REQUEST, /* sent SDTR message */ |
229 | SYNC_COMPLETED, /* received SDTR reply */ | 229 | SYNC_COMPLETED, /* received SDTR reply */ |
230 | } syncxfer_t; | 230 | } syncxfer_t; |
@@ -322,7 +322,7 @@ typedef struct acornscsi_hostdata { | |||
322 | /* per-device info */ | 322 | /* per-device info */ |
323 | struct { | 323 | struct { |
324 | unsigned char sync_xfer; /* synchronous transfer (SBIC value) */ | 324 | unsigned char sync_xfer; /* synchronous transfer (SBIC value) */ |
325 | syncxfer_t sync_state; /* sync xfer negociation state */ | 325 | syncxfer_t sync_state; /* sync xfer negotiation state */ |
326 | unsigned char disconnect_ok:1; /* device can disconnect */ | 326 | unsigned char disconnect_ok:1; /* device can disconnect */ |
327 | } device[8]; | 327 | } device[8]; |
328 | unsigned long busyluns[64 / sizeof(unsigned long)];/* array of bits indicating LUNs busy */ | 328 | unsigned long busyluns[64 / sizeof(unsigned long)];/* array of bits indicating LUNs busy */ |
diff --git a/drivers/scsi/arm/arxescsi.c b/drivers/scsi/arm/arxescsi.c index 2836fe248df9..a750aa72b8ef 100644 --- a/drivers/scsi/arm/arxescsi.c +++ b/drivers/scsi/arm/arxescsi.c | |||
@@ -228,7 +228,7 @@ static const char *arxescsi_info(struct Scsi_Host *host) | |||
228 | * Params : buffer - a buffer to write information to | 228 | * Params : buffer - a buffer to write information to |
229 | * start - a pointer into this buffer set by this routine to the start | 229 | * start - a pointer into this buffer set by this routine to the start |
230 | * of the required information. | 230 | * of the required information. |
231 | * offset - offset into information that we have read upto. | 231 | * offset - offset into information that we have read up to. |
232 | * length - length of buffer | 232 | * length - length of buffer |
233 | * host_no - host number to return information for | 233 | * host_no - host number to return information for |
234 | * inout - 0 for reading, 1 for writing. | 234 | * inout - 0 for reading, 1 for writing. |
diff --git a/drivers/scsi/arm/cumana_2.c b/drivers/scsi/arm/cumana_2.c index c9902b5c1f2b..547987b86384 100644 --- a/drivers/scsi/arm/cumana_2.c +++ b/drivers/scsi/arm/cumana_2.c | |||
@@ -344,7 +344,7 @@ cumanascsi_2_set_proc_info(struct Scsi_Host *host, char *buffer, int length) | |||
344 | * Params : buffer - a buffer to write information to | 344 | * Params : buffer - a buffer to write information to |
345 | * start - a pointer into this buffer set by this routine to the start | 345 | * start - a pointer into this buffer set by this routine to the start |
346 | * of the required information. | 346 | * of the required information. |
347 | * offset - offset into information that we have read upto. | 347 | * offset - offset into information that we have read up to. |
348 | * length - length of buffer | 348 | * length - length of buffer |
349 | * host_no - host number to return information for | 349 | * host_no - host number to return information for |
350 | * inout - 0 for reading, 1 for writing. | 350 | * inout - 0 for reading, 1 for writing. |
diff --git a/drivers/scsi/arm/eesox.c b/drivers/scsi/arm/eesox.c index d8435132f461..edfd12b48c28 100644 --- a/drivers/scsi/arm/eesox.c +++ b/drivers/scsi/arm/eesox.c | |||
@@ -429,7 +429,7 @@ eesoxscsi_set_proc_info(struct Scsi_Host *host, char *buffer, int length) | |||
429 | * Params : buffer - a buffer to write information to | 429 | * Params : buffer - a buffer to write information to |
430 | * start - a pointer into this buffer set by this routine to the start | 430 | * start - a pointer into this buffer set by this routine to the start |
431 | * of the required information. | 431 | * of the required information. |
432 | * offset - offset into information that we have read upto. | 432 | * offset - offset into information that we have read up to. |
433 | * length - length of buffer | 433 | * length - length of buffer |
434 | * host_no - host number to return information for | 434 | * host_no - host number to return information for |
435 | * inout - 0 for reading, 1 for writing. | 435 | * inout - 0 for reading, 1 for writing. |
diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c index 2b2ce21e227e..e85c40b6e19b 100644 --- a/drivers/scsi/arm/fas216.c +++ b/drivers/scsi/arm/fas216.c | |||
@@ -2119,7 +2119,7 @@ request_sense: | |||
2119 | * executed, unless a target connects to us. | 2119 | * executed, unless a target connects to us. |
2120 | */ | 2120 | */ |
2121 | if (info->reqSCpnt) | 2121 | if (info->reqSCpnt) |
2122 | printk(KERN_WARNING "scsi%d.%c: loosing request command\n", | 2122 | printk(KERN_WARNING "scsi%d.%c: losing request command\n", |
2123 | info->host->host_no, '0' + SCpnt->device->id); | 2123 | info->host->host_no, '0' + SCpnt->device->id); |
2124 | info->reqSCpnt = SCpnt; | 2124 | info->reqSCpnt = SCpnt; |
2125 | } | 2125 | } |
@@ -2294,7 +2294,7 @@ static int fas216_noqueue_command_lck(struct scsi_cmnd *SCpnt, | |||
2294 | * If we don't have an IRQ, then we must poll the card for | 2294 | * If we don't have an IRQ, then we must poll the card for |
2295 | * it's interrupt, and use that to call this driver's | 2295 | * it's interrupt, and use that to call this driver's |
2296 | * interrupt routine. That way, we keep the command | 2296 | * interrupt routine. That way, we keep the command |
2297 | * progressing. Maybe we can add some inteligence here | 2297 | * progressing. Maybe we can add some intelligence here |
2298 | * and go to sleep if we know that the device is going | 2298 | * and go to sleep if we know that the device is going |
2299 | * to be some time (eg, disconnected). | 2299 | * to be some time (eg, disconnected). |
2300 | */ | 2300 | */ |
diff --git a/drivers/scsi/arm/fas216.h b/drivers/scsi/arm/fas216.h index f30f8d659dc4..84b7127c0121 100644 --- a/drivers/scsi/arm/fas216.h +++ b/drivers/scsi/arm/fas216.h | |||
@@ -203,11 +203,11 @@ typedef enum { | |||
203 | } fasdmatype_t; | 203 | } fasdmatype_t; |
204 | 204 | ||
205 | typedef enum { | 205 | typedef enum { |
206 | neg_wait, /* Negociate with device */ | 206 | neg_wait, /* Negotiate with device */ |
207 | neg_inprogress, /* Negociation sent */ | 207 | neg_inprogress, /* Negotiation sent */ |
208 | neg_complete, /* Negociation complete */ | 208 | neg_complete, /* Negotiation complete */ |
209 | neg_targcomplete, /* Target completed negociation */ | 209 | neg_targcomplete, /* Target completed negotiation */ |
210 | neg_invalid /* Negociation not supported */ | 210 | neg_invalid /* Negotiation not supported */ |
211 | } neg_t; | 211 | } neg_t; |
212 | 212 | ||
213 | #define MAGIC 0x441296bdUL | 213 | #define MAGIC 0x441296bdUL |
diff --git a/drivers/scsi/arm/powertec.c b/drivers/scsi/arm/powertec.c index e2297b4c1b9e..9274c0677b9c 100644 --- a/drivers/scsi/arm/powertec.c +++ b/drivers/scsi/arm/powertec.c | |||
@@ -232,7 +232,7 @@ powertecscsi_set_proc_info(struct Scsi_Host *host, char *buffer, int length) | |||
232 | * Params : buffer - a buffer to write information to | 232 | * Params : buffer - a buffer to write information to |
233 | * start - a pointer into this buffer set by this routine to the start | 233 | * start - a pointer into this buffer set by this routine to the start |
234 | * of the required information. | 234 | * of the required information. |
235 | * offset - offset into information that we have read upto. | 235 | * offset - offset into information that we have read up to. |
236 | * length - length of buffer | 236 | * length - length of buffer |
237 | * inout - 0 for reading, 1 for writing. | 237 | * inout - 0 for reading, 1 for writing. |
238 | * Returns : length of data written to buffer. | 238 | * Returns : length of data written to buffer. |
diff --git a/drivers/scsi/atari_NCR5380.c b/drivers/scsi/atari_NCR5380.c index 88b2928b4d3b..ea439f93ed81 100644 --- a/drivers/scsi/atari_NCR5380.c +++ b/drivers/scsi/atari_NCR5380.c | |||
@@ -464,7 +464,7 @@ static void free_all_tags(void) | |||
464 | * | 464 | * |
465 | * Parameters: Scsi_Cmnd *cmd | 465 | * Parameters: Scsi_Cmnd *cmd |
466 | * The command to work on. The first scatter buffer's data are | 466 | * The command to work on. The first scatter buffer's data are |
467 | * assumed to be already transfered into ptr/this_residual. | 467 | * assumed to be already transferred into ptr/this_residual. |
468 | */ | 468 | */ |
469 | 469 | ||
470 | static void merge_contiguous_buffers(Scsi_Cmnd *cmd) | 470 | static void merge_contiguous_buffers(Scsi_Cmnd *cmd) |
@@ -1720,7 +1720,7 @@ static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd, int tag) | |||
1720 | * bytes to transfer, **data - pointer to data pointer. | 1720 | * bytes to transfer, **data - pointer to data pointer. |
1721 | * | 1721 | * |
1722 | * Returns : -1 when different phase is entered without transferring | 1722 | * Returns : -1 when different phase is entered without transferring |
1723 | * maximum number of bytes, 0 if all bytes are transfered or exit | 1723 | * maximum number of bytes, 0 if all bytes are transferred or exit |
1724 | * is in same phase. | 1724 | * is in same phase. |
1725 | * | 1725 | * |
1726 | * Also, *phase, *count, *data are modified in place. | 1726 | * Also, *phase, *count, *data are modified in place. |
@@ -1911,7 +1911,7 @@ static int do_abort(struct Scsi_Host *host) | |||
1911 | * bytes to transfer, **data - pointer to data pointer. | 1911 | * bytes to transfer, **data - pointer to data pointer. |
1912 | * | 1912 | * |
1913 | * Returns : -1 when different phase is entered without transferring | 1913 | * Returns : -1 when different phase is entered without transferring |
1914 | * maximum number of bytes, 0 if all bytes or transfered or exit | 1914 | * maximum number of bytes, 0 if all bytes or transferred or exit |
1915 | * is in same phase. | 1915 | * is in same phase. |
1916 | * | 1916 | * |
1917 | * Also, *phase, *count, *data are modified in place. | 1917 | * Also, *phase, *count, *data are modified in place. |
diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c index 76029d570beb..7e6eca4a125e 100644 --- a/drivers/scsi/atp870u.c +++ b/drivers/scsi/atp870u.c | |||
@@ -1228,7 +1228,7 @@ TCM_5: /* isolation complete.. */ | |||
1228 | printk(" \n%x %x %x %s\n ",assignid_map,mbuf[0],mbuf[1],&mbuf[2]); */ | 1228 | printk(" \n%x %x %x %s\n ",assignid_map,mbuf[0],mbuf[1],&mbuf[2]); */ |
1229 | i = 15; | 1229 | i = 15; |
1230 | j = mbuf[0]; | 1230 | j = mbuf[0]; |
1231 | if ((j & 0x20) != 0) { /* bit5=1:ID upto 7 */ | 1231 | if ((j & 0x20) != 0) { /* bit5=1:ID up to 7 */ |
1232 | i = 7; | 1232 | i = 7; |
1233 | } | 1233 | } |
1234 | if ((j & 0x06) == 0) { /* IDvalid? */ | 1234 | if ((j & 0x06) == 0) { /* IDvalid? */ |
diff --git a/drivers/scsi/be2iscsi/be_cmds.h b/drivers/scsi/be2iscsi/be_cmds.h index 5218de4ab35a..fbd1dc2c15f7 100644 --- a/drivers/scsi/be2iscsi/be_cmds.h +++ b/drivers/scsi/be2iscsi/be_cmds.h | |||
@@ -877,7 +877,7 @@ struct be_all_if_id { | |||
877 | */ | 877 | */ |
878 | #define CXN_KILLED_PDU_SIZE_EXCEEDS_DSL 3 /* Connection got invalidated | 878 | #define CXN_KILLED_PDU_SIZE_EXCEEDS_DSL 3 /* Connection got invalidated |
879 | * internally | 879 | * internally |
880 | * due to a recieved PDU | 880 | * due to a received PDU |
881 | * size > DSL | 881 | * size > DSL |
882 | */ | 882 | */ |
883 | #define CXN_KILLED_BURST_LEN_MISMATCH 4 /* Connection got invalidated | 883 | #define CXN_KILLED_BURST_LEN_MISMATCH 4 /* Connection got invalidated |
@@ -886,7 +886,7 @@ struct be_all_if_id { | |||
886 | * FBL/MBL. | 886 | * FBL/MBL. |
887 | */ | 887 | */ |
888 | #define CXN_KILLED_AHS_RCVD 5 /* Connection got invalidated | 888 | #define CXN_KILLED_AHS_RCVD 5 /* Connection got invalidated |
889 | * internally due to a recieved | 889 | * internally due to a received |
890 | * PDU Hdr that has | 890 | * PDU Hdr that has |
891 | * AHS */ | 891 | * AHS */ |
892 | #define CXN_KILLED_HDR_DIGEST_ERR 6 /* Connection got invalidated | 892 | #define CXN_KILLED_HDR_DIGEST_ERR 6 /* Connection got invalidated |
@@ -899,12 +899,12 @@ struct be_all_if_id { | |||
899 | * pdu hdr | 899 | * pdu hdr |
900 | */ | 900 | */ |
901 | #define CXN_KILLED_STALE_ITT_TTT_RCVD 8 /* Connection got invalidated | 901 | #define CXN_KILLED_STALE_ITT_TTT_RCVD 8 /* Connection got invalidated |
902 | * internally due to a recieved | 902 | * internally due to a received |
903 | * ITT/TTT that does not belong | 903 | * ITT/TTT that does not belong |
904 | * to this Connection | 904 | * to this Connection |
905 | */ | 905 | */ |
906 | #define CXN_KILLED_INVALID_ITT_TTT_RCVD 9 /* Connection got invalidated | 906 | #define CXN_KILLED_INVALID_ITT_TTT_RCVD 9 /* Connection got invalidated |
907 | * internally due to recieved | 907 | * internally due to received |
908 | * ITT/TTT value > Max | 908 | * ITT/TTT value > Max |
909 | * Supported ITTs/TTTs | 909 | * Supported ITTs/TTTs |
910 | */ | 910 | */ |
@@ -936,21 +936,21 @@ struct be_all_if_id { | |||
936 | * index. | 936 | * index. |
937 | */ | 937 | */ |
938 | #define CXN_KILLED_OVER_RUN_RESIDUAL 16 /* Command got invalidated | 938 | #define CXN_KILLED_OVER_RUN_RESIDUAL 16 /* Command got invalidated |
939 | * internally due to recived | 939 | * internally due to received |
940 | * command has residual | 940 | * command has residual |
941 | * over run bytes. | 941 | * over run bytes. |
942 | */ | 942 | */ |
943 | #define CXN_KILLED_UNDER_RUN_RESIDUAL 17 /* Command got invalidated | 943 | #define CXN_KILLED_UNDER_RUN_RESIDUAL 17 /* Command got invalidated |
944 | * internally due to recived | 944 | * internally due to received |
945 | * command has residual under | 945 | * command has residual under |
946 | * run bytes. | 946 | * run bytes. |
947 | */ | 947 | */ |
948 | #define CMD_KILLED_INVALID_STATSN_RCVD 18 /* Command got invalidated | 948 | #define CMD_KILLED_INVALID_STATSN_RCVD 18 /* Command got invalidated |
949 | * internally due to a recieved | 949 | * internally due to a received |
950 | * PDU has an invalid StatusSN | 950 | * PDU has an invalid StatusSN |
951 | */ | 951 | */ |
952 | #define CMD_KILLED_INVALID_R2T_RCVD 19 /* Command got invalidated | 952 | #define CMD_KILLED_INVALID_R2T_RCVD 19 /* Command got invalidated |
953 | * internally due to a recieved | 953 | * internally due to a received |
954 | * an R2T with some invalid | 954 | * an R2T with some invalid |
955 | * fields in it | 955 | * fields in it |
956 | */ | 956 | */ |
@@ -973,7 +973,7 @@ struct be_all_if_id { | |||
973 | */ | 973 | */ |
974 | #define CMD_CXN_KILLED_INVALID_DATASN_RCVD 24 /* Command got invalidated | 974 | #define CMD_CXN_KILLED_INVALID_DATASN_RCVD 24 /* Command got invalidated |
975 | * internally due to a | 975 | * internally due to a |
976 | * recieved PDU has an invalid | 976 | * received PDU has an invalid |
977 | * DataSN | 977 | * DataSN |
978 | */ | 978 | */ |
979 | #define CXN_INVALIDATE_NOTIFY 25 /* Connection invalidation | 979 | #define CXN_INVALIDATE_NOTIFY 25 /* Connection invalidation |
diff --git a/drivers/scsi/bfa/bfa_core.c b/drivers/scsi/bfa/bfa_core.c index 1cd5c8b0618d..91838c51fb76 100644 --- a/drivers/scsi/bfa/bfa_core.c +++ b/drivers/scsi/bfa/bfa_core.c | |||
@@ -355,7 +355,7 @@ bfa_msix_lpu_err(struct bfa_s *bfa, int vec) | |||
355 | /* | 355 | /* |
356 | * ERR_PSS bit needs to be cleared as well in case | 356 | * ERR_PSS bit needs to be cleared as well in case |
357 | * interrups are shared so driver's interrupt handler is | 357 | * interrups are shared so driver's interrupt handler is |
358 | * still called eventhough it is already masked out. | 358 | * still called even though it is already masked out. |
359 | */ | 359 | */ |
360 | curr_value = readl( | 360 | curr_value = readl( |
361 | bfa->ioc.ioc_regs.pss_err_status_reg); | 361 | bfa->ioc.ioc_regs.pss_err_status_reg); |
diff --git a/drivers/scsi/bfa/bfa_defs_svc.h b/drivers/scsi/bfa/bfa_defs_svc.h index 648c84176722..207f598877c7 100644 --- a/drivers/scsi/bfa/bfa_defs_svc.h +++ b/drivers/scsi/bfa/bfa_defs_svc.h | |||
@@ -145,7 +145,7 @@ struct bfa_fw_io_stats_s { | |||
145 | u32 ioh_data_oor_event; /* Data out of range */ | 145 | u32 ioh_data_oor_event; /* Data out of range */ |
146 | u32 ioh_ro_ooo_event; /* Relative offset out of range */ | 146 | u32 ioh_ro_ooo_event; /* Relative offset out of range */ |
147 | u32 ioh_cpu_owned_event; /* IOH hit -iost owned by f/w */ | 147 | u32 ioh_cpu_owned_event; /* IOH hit -iost owned by f/w */ |
148 | u32 ioh_unexp_frame_event; /* unexpected frame recieved | 148 | u32 ioh_unexp_frame_event; /* unexpected frame received |
149 | * count */ | 149 | * count */ |
150 | u32 ioh_err_int; /* IOH error int during data-phase | 150 | u32 ioh_err_int; /* IOH error int during data-phase |
151 | * for scsi write | 151 | * for scsi write |
@@ -566,8 +566,8 @@ struct bfa_itnim_iostats_s { | |||
566 | u32 input_reqs; /* Data in-bound requests */ | 566 | u32 input_reqs; /* Data in-bound requests */ |
567 | u32 output_reqs; /* Data out-bound requests */ | 567 | u32 output_reqs; /* Data out-bound requests */ |
568 | u32 io_comps; /* Total IO Completions */ | 568 | u32 io_comps; /* Total IO Completions */ |
569 | u32 wr_throughput; /* Write data transfered in bytes */ | 569 | u32 wr_throughput; /* Write data transferred in bytes */ |
570 | u32 rd_throughput; /* Read data transfered in bytes */ | 570 | u32 rd_throughput; /* Read data transferred in bytes */ |
571 | 571 | ||
572 | u32 iocomp_ok; /* Slowpath IO completions */ | 572 | u32 iocomp_ok; /* Slowpath IO completions */ |
573 | u32 iocomp_underrun; /* IO underrun */ | 573 | u32 iocomp_underrun; /* IO underrun */ |
diff --git a/drivers/scsi/bfa/bfa_fc.h b/drivers/scsi/bfa/bfa_fc.h index 8e764fae8dc9..bf0067e0fd0d 100644 --- a/drivers/scsi/bfa/bfa_fc.h +++ b/drivers/scsi/bfa/bfa_fc.h | |||
@@ -315,7 +315,7 @@ struct fc_plogi_csp_s { | |||
315 | query_dbc:1, | 315 | query_dbc:1, |
316 | hg_supp:1; | 316 | hg_supp:1; |
317 | #endif | 317 | #endif |
318 | __be16 rxsz; /* recieve data_field size */ | 318 | __be16 rxsz; /* receive data_field size */ |
319 | __be16 conseq; | 319 | __be16 conseq; |
320 | __be16 ro_bitmap; | 320 | __be16 ro_bitmap; |
321 | __be32 e_d_tov; | 321 | __be32 e_d_tov; |
diff --git a/drivers/scsi/bfa/bfa_fcs.c b/drivers/scsi/bfa/bfa_fcs.c index f674f9318629..9b43ca4b6778 100644 --- a/drivers/scsi/bfa/bfa_fcs.c +++ b/drivers/scsi/bfa/bfa_fcs.c | |||
@@ -1033,7 +1033,7 @@ bfa_fcs_fabric_delvport(struct bfa_fcs_fabric_s *fabric, | |||
1033 | 1033 | ||
1034 | 1034 | ||
1035 | /* | 1035 | /* |
1036 | * Lookup for a vport withing a fabric given its pwwn | 1036 | * Lookup for a vport within a fabric given its pwwn |
1037 | */ | 1037 | */ |
1038 | struct bfa_fcs_vport_s * | 1038 | struct bfa_fcs_vport_s * |
1039 | bfa_fcs_fabric_vport_lookup(struct bfa_fcs_fabric_s *fabric, wwn_t pwwn) | 1039 | bfa_fcs_fabric_vport_lookup(struct bfa_fcs_fabric_s *fabric, wwn_t pwwn) |
diff --git a/drivers/scsi/bfa/bfa_fcs.h b/drivers/scsi/bfa/bfa_fcs.h index 0fd63168573f..61cdce4bd913 100644 --- a/drivers/scsi/bfa/bfa_fcs.h +++ b/drivers/scsi/bfa/bfa_fcs.h | |||
@@ -705,7 +705,7 @@ enum rport_event { | |||
705 | RPSM_EVENT_ADDRESS_CHANGE = 15, /* Rport's PID has changed */ | 705 | RPSM_EVENT_ADDRESS_CHANGE = 15, /* Rport's PID has changed */ |
706 | RPSM_EVENT_ADDRESS_DISC = 16, /* Need to Discover rport's PID */ | 706 | RPSM_EVENT_ADDRESS_DISC = 16, /* Need to Discover rport's PID */ |
707 | RPSM_EVENT_PRLO_RCVD = 17, /* PRLO from remote device */ | 707 | RPSM_EVENT_PRLO_RCVD = 17, /* PRLO from remote device */ |
708 | RPSM_EVENT_PLOGI_RETRY = 18, /* Retry PLOGI continously */ | 708 | RPSM_EVENT_PLOGI_RETRY = 18, /* Retry PLOGI continuously */ |
709 | }; | 709 | }; |
710 | 710 | ||
711 | /* | 711 | /* |
diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c index 43fa986bb586..1d6be8c14473 100644 --- a/drivers/scsi/bfa/bfa_fcs_lport.c +++ b/drivers/scsi/bfa/bfa_fcs_lport.c | |||
@@ -1149,7 +1149,7 @@ bfa_fcs_lport_fdmi_sm_offline(struct bfa_fcs_lport_fdmi_s *fdmi, | |||
1149 | } else { | 1149 | } else { |
1150 | /* | 1150 | /* |
1151 | * For a base port, we should first register the HBA | 1151 | * For a base port, we should first register the HBA |
1152 | * atribute. The HBA attribute also contains the base | 1152 | * attribute. The HBA attribute also contains the base |
1153 | * port registration. | 1153 | * port registration. |
1154 | */ | 1154 | */ |
1155 | bfa_sm_set_state(fdmi, | 1155 | bfa_sm_set_state(fdmi, |
diff --git a/drivers/scsi/bfa/bfa_svc.c b/drivers/scsi/bfa/bfa_svc.c index 1d34921f88bf..16d9a5f61c18 100644 --- a/drivers/scsi/bfa/bfa_svc.c +++ b/drivers/scsi/bfa/bfa_svc.c | |||
@@ -1035,7 +1035,7 @@ bfa_fcxp_free(struct bfa_fcxp_s *fcxp) | |||
1035 | * @param[in] rport BFA rport pointer. Could be left NULL for WKA rports | 1035 | * @param[in] rport BFA rport pointer. Could be left NULL for WKA rports |
1036 | * @param[in] vf_id virtual Fabric ID | 1036 | * @param[in] vf_id virtual Fabric ID |
1037 | * @param[in] lp_tag lport tag | 1037 | * @param[in] lp_tag lport tag |
1038 | * @param[in] cts use Continous sequence | 1038 | * @param[in] cts use Continuous sequence |
1039 | * @param[in] cos fc Class of Service | 1039 | * @param[in] cos fc Class of Service |
1040 | * @param[in] reqlen request length, does not include FCHS length | 1040 | * @param[in] reqlen request length, does not include FCHS length |
1041 | * @param[in] fchs fc Header Pointer. The header content will be copied | 1041 | * @param[in] fchs fc Header Pointer. The header content will be copied |
@@ -5022,7 +5022,7 @@ bfa_uf_start(struct bfa_s *bfa) | |||
5022 | } | 5022 | } |
5023 | 5023 | ||
5024 | /* | 5024 | /* |
5025 | * Register handler for all unsolicted recieve frames. | 5025 | * Register handler for all unsolicted receive frames. |
5026 | * | 5026 | * |
5027 | * @param[in] bfa BFA instance | 5027 | * @param[in] bfa BFA instance |
5028 | * @param[in] ufrecv receive handler function | 5028 | * @param[in] ufrecv receive handler function |
diff --git a/drivers/scsi/bfa/bfa_svc.h b/drivers/scsi/bfa/bfa_svc.h index 331ad992a581..5902a45c080f 100644 --- a/drivers/scsi/bfa/bfa_svc.h +++ b/drivers/scsi/bfa/bfa_svc.h | |||
@@ -127,7 +127,7 @@ struct bfa_fcxp_req_info_s { | |||
127 | * rport nexus is established | 127 | * rport nexus is established |
128 | */ | 128 | */ |
129 | struct fchs_s fchs; /* request FC header structure */ | 129 | struct fchs_s fchs; /* request FC header structure */ |
130 | u8 cts; /* continous sequence */ | 130 | u8 cts; /* continuous sequence */ |
131 | u8 class; /* FC class for the request/response */ | 131 | u8 class; /* FC class for the request/response */ |
132 | u16 max_frmsz; /* max send frame size */ | 132 | u16 max_frmsz; /* max send frame size */ |
133 | u16 vf_id; /* vsan tag if applicable */ | 133 | u16 vf_id; /* vsan tag if applicable */ |
diff --git a/drivers/scsi/bfa/bfad.c b/drivers/scsi/bfa/bfad.c index 44524cf55d33..0fd510a01561 100644 --- a/drivers/scsi/bfa/bfad.c +++ b/drivers/scsi/bfa/bfad.c | |||
@@ -1278,7 +1278,7 @@ bfad_setup_intr(struct bfad_s *bfad) | |||
1278 | * interrupts into one vector, so even if we | 1278 | * interrupts into one vector, so even if we |
1279 | * can try to request less vectors, we don't | 1279 | * can try to request less vectors, we don't |
1280 | * know how to associate interrupt events to | 1280 | * know how to associate interrupt events to |
1281 | * vectors. Linux doesn't dupicate vectors | 1281 | * vectors. Linux doesn't duplicate vectors |
1282 | * in the MSIX table for this case. | 1282 | * in the MSIX table for this case. |
1283 | */ | 1283 | */ |
1284 | 1284 | ||
diff --git a/drivers/scsi/bnx2fc/57xx_hsi_bnx2fc.h b/drivers/scsi/bnx2fc/57xx_hsi_bnx2fc.h index 69d031d98469..97a61b4d81b7 100644 --- a/drivers/scsi/bnx2fc/57xx_hsi_bnx2fc.h +++ b/drivers/scsi/bnx2fc/57xx_hsi_bnx2fc.h | |||
@@ -898,7 +898,7 @@ struct fcoe_confqe { | |||
898 | 898 | ||
899 | 899 | ||
900 | /* | 900 | /* |
901 | * FCoE conection data base | 901 | * FCoE connection data base |
902 | */ | 902 | */ |
903 | struct fcoe_conn_db { | 903 | struct fcoe_conn_db { |
904 | #if defined(__BIG_ENDIAN) | 904 | #if defined(__BIG_ENDIAN) |
diff --git a/drivers/scsi/bnx2fc/bnx2fc.h b/drivers/scsi/bnx2fc/bnx2fc.h index df2fc09ba479..b6d350ac4288 100644 --- a/drivers/scsi/bnx2fc/bnx2fc.h +++ b/drivers/scsi/bnx2fc/bnx2fc.h | |||
@@ -62,7 +62,7 @@ | |||
62 | #include "bnx2fc_constants.h" | 62 | #include "bnx2fc_constants.h" |
63 | 63 | ||
64 | #define BNX2FC_NAME "bnx2fc" | 64 | #define BNX2FC_NAME "bnx2fc" |
65 | #define BNX2FC_VERSION "1.0.0" | 65 | #define BNX2FC_VERSION "1.0.1" |
66 | 66 | ||
67 | #define PFX "bnx2fc: " | 67 | #define PFX "bnx2fc: " |
68 | 68 | ||
@@ -84,9 +84,15 @@ | |||
84 | #define BNX2FC_NUM_MAX_SESS 128 | 84 | #define BNX2FC_NUM_MAX_SESS 128 |
85 | #define BNX2FC_NUM_MAX_SESS_LOG (ilog2(BNX2FC_NUM_MAX_SESS)) | 85 | #define BNX2FC_NUM_MAX_SESS_LOG (ilog2(BNX2FC_NUM_MAX_SESS)) |
86 | 86 | ||
87 | #define BNX2FC_MAX_OUTSTANDING_CMNDS 4096 | 87 | #define BNX2FC_MAX_OUTSTANDING_CMNDS 2048 |
88 | #define BNX2FC_CAN_QUEUE BNX2FC_MAX_OUTSTANDING_CMNDS | ||
89 | #define BNX2FC_ELSTM_XIDS BNX2FC_CAN_QUEUE | ||
88 | #define BNX2FC_MIN_PAYLOAD 256 | 90 | #define BNX2FC_MIN_PAYLOAD 256 |
89 | #define BNX2FC_MAX_PAYLOAD 2048 | 91 | #define BNX2FC_MAX_PAYLOAD 2048 |
92 | #define BNX2FC_MFS \ | ||
93 | (BNX2FC_MAX_PAYLOAD + sizeof(struct fc_frame_header)) | ||
94 | #define BNX2FC_MINI_JUMBO_MTU 2500 | ||
95 | |||
90 | 96 | ||
91 | #define BNX2FC_RQ_BUF_SZ 256 | 97 | #define BNX2FC_RQ_BUF_SZ 256 |
92 | #define BNX2FC_RQ_BUF_LOG_SZ (ilog2(BNX2FC_RQ_BUF_SZ)) | 98 | #define BNX2FC_RQ_BUF_LOG_SZ (ilog2(BNX2FC_RQ_BUF_SZ)) |
@@ -98,7 +104,8 @@ | |||
98 | #define BNX2FC_CONFQ_WQE_SIZE (sizeof(struct fcoe_confqe)) | 104 | #define BNX2FC_CONFQ_WQE_SIZE (sizeof(struct fcoe_confqe)) |
99 | #define BNX2FC_5771X_DB_PAGE_SIZE 128 | 105 | #define BNX2FC_5771X_DB_PAGE_SIZE 128 |
100 | 106 | ||
101 | #define BNX2FC_MAX_TASKS BNX2FC_MAX_OUTSTANDING_CMNDS | 107 | #define BNX2FC_MAX_TASKS \ |
108 | (BNX2FC_MAX_OUTSTANDING_CMNDS + BNX2FC_ELSTM_XIDS) | ||
102 | #define BNX2FC_TASK_SIZE 128 | 109 | #define BNX2FC_TASK_SIZE 128 |
103 | #define BNX2FC_TASKS_PER_PAGE (PAGE_SIZE/BNX2FC_TASK_SIZE) | 110 | #define BNX2FC_TASKS_PER_PAGE (PAGE_SIZE/BNX2FC_TASK_SIZE) |
104 | #define BNX2FC_TASK_CTX_ARR_SZ (BNX2FC_MAX_TASKS/BNX2FC_TASKS_PER_PAGE) | 111 | #define BNX2FC_TASK_CTX_ARR_SZ (BNX2FC_MAX_TASKS/BNX2FC_TASKS_PER_PAGE) |
@@ -112,10 +119,10 @@ | |||
112 | #define BNX2FC_WRITE (1 << 0) | 119 | #define BNX2FC_WRITE (1 << 0) |
113 | 120 | ||
114 | #define BNX2FC_MIN_XID 0 | 121 | #define BNX2FC_MIN_XID 0 |
115 | #define BNX2FC_MAX_XID (BNX2FC_MAX_OUTSTANDING_CMNDS - 1) | 122 | #define BNX2FC_MAX_XID \ |
116 | #define FCOE_MIN_XID (BNX2FC_MAX_OUTSTANDING_CMNDS) | 123 | (BNX2FC_MAX_OUTSTANDING_CMNDS + BNX2FC_ELSTM_XIDS - 1) |
117 | #define FCOE_MAX_XID \ | 124 | #define FCOE_MIN_XID (BNX2FC_MAX_XID + 1) |
118 | (BNX2FC_MAX_OUTSTANDING_CMNDS + (nr_cpu_ids * 256)) | 125 | #define FCOE_MAX_XID (FCOE_MIN_XID + 4095) |
119 | #define BNX2FC_MAX_LUN 0xFFFF | 126 | #define BNX2FC_MAX_LUN 0xFFFF |
120 | #define BNX2FC_MAX_FCP_TGT 256 | 127 | #define BNX2FC_MAX_FCP_TGT 256 |
121 | #define BNX2FC_MAX_CMD_LEN 16 | 128 | #define BNX2FC_MAX_CMD_LEN 16 |
@@ -125,7 +132,6 @@ | |||
125 | 132 | ||
126 | #define BNX2FC_WAIT_CNT 120 | 133 | #define BNX2FC_WAIT_CNT 120 |
127 | #define BNX2FC_FW_TIMEOUT (3 * HZ) | 134 | #define BNX2FC_FW_TIMEOUT (3 * HZ) |
128 | |||
129 | #define PORT_MAX 2 | 135 | #define PORT_MAX 2 |
130 | 136 | ||
131 | #define CMD_SCSI_STATUS(Cmnd) ((Cmnd)->SCp.Status) | 137 | #define CMD_SCSI_STATUS(Cmnd) ((Cmnd)->SCp.Status) |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_els.c b/drivers/scsi/bnx2fc/bnx2fc_els.c index 7a11a255157f..52c358427ce2 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_els.c +++ b/drivers/scsi/bnx2fc/bnx2fc_els.c | |||
@@ -397,7 +397,7 @@ void bnx2fc_process_els_compl(struct bnx2fc_cmd *els_req, | |||
397 | &els_req->req_flags)) { | 397 | &els_req->req_flags)) { |
398 | BNX2FC_ELS_DBG("Timer context finished processing this " | 398 | BNX2FC_ELS_DBG("Timer context finished processing this " |
399 | "els - 0x%x\n", els_req->xid); | 399 | "els - 0x%x\n", els_req->xid); |
400 | /* This IO doesnt receive cleanup completion */ | 400 | /* This IO doesn't receive cleanup completion */ |
401 | kref_put(&els_req->refcount, bnx2fc_cmd_release); | 401 | kref_put(&els_req->refcount, bnx2fc_cmd_release); |
402 | return; | 402 | return; |
403 | } | 403 | } |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c index e476e8753079..e2e647509a73 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c | |||
@@ -21,7 +21,7 @@ DEFINE_PER_CPU(struct bnx2fc_percpu_s, bnx2fc_percpu); | |||
21 | 21 | ||
22 | #define DRV_MODULE_NAME "bnx2fc" | 22 | #define DRV_MODULE_NAME "bnx2fc" |
23 | #define DRV_MODULE_VERSION BNX2FC_VERSION | 23 | #define DRV_MODULE_VERSION BNX2FC_VERSION |
24 | #define DRV_MODULE_RELDATE "Jan 25, 2011" | 24 | #define DRV_MODULE_RELDATE "Mar 17, 2011" |
25 | 25 | ||
26 | 26 | ||
27 | static char version[] __devinitdata = | 27 | static char version[] __devinitdata = |
@@ -437,17 +437,16 @@ static int bnx2fc_l2_rcv_thread(void *arg) | |||
437 | set_current_state(TASK_INTERRUPTIBLE); | 437 | set_current_state(TASK_INTERRUPTIBLE); |
438 | while (!kthread_should_stop()) { | 438 | while (!kthread_should_stop()) { |
439 | schedule(); | 439 | schedule(); |
440 | set_current_state(TASK_RUNNING); | ||
441 | spin_lock_bh(&bg->fcoe_rx_list.lock); | 440 | spin_lock_bh(&bg->fcoe_rx_list.lock); |
442 | while ((skb = __skb_dequeue(&bg->fcoe_rx_list)) != NULL) { | 441 | while ((skb = __skb_dequeue(&bg->fcoe_rx_list)) != NULL) { |
443 | spin_unlock_bh(&bg->fcoe_rx_list.lock); | 442 | spin_unlock_bh(&bg->fcoe_rx_list.lock); |
444 | bnx2fc_recv_frame(skb); | 443 | bnx2fc_recv_frame(skb); |
445 | spin_lock_bh(&bg->fcoe_rx_list.lock); | 444 | spin_lock_bh(&bg->fcoe_rx_list.lock); |
446 | } | 445 | } |
446 | __set_current_state(TASK_INTERRUPTIBLE); | ||
447 | spin_unlock_bh(&bg->fcoe_rx_list.lock); | 447 | spin_unlock_bh(&bg->fcoe_rx_list.lock); |
448 | set_current_state(TASK_INTERRUPTIBLE); | ||
449 | } | 448 | } |
450 | set_current_state(TASK_RUNNING); | 449 | __set_current_state(TASK_RUNNING); |
451 | return 0; | 450 | return 0; |
452 | } | 451 | } |
453 | 452 | ||
@@ -569,7 +568,6 @@ int bnx2fc_percpu_io_thread(void *arg) | |||
569 | set_current_state(TASK_INTERRUPTIBLE); | 568 | set_current_state(TASK_INTERRUPTIBLE); |
570 | while (!kthread_should_stop()) { | 569 | while (!kthread_should_stop()) { |
571 | schedule(); | 570 | schedule(); |
572 | set_current_state(TASK_RUNNING); | ||
573 | spin_lock_bh(&p->fp_work_lock); | 571 | spin_lock_bh(&p->fp_work_lock); |
574 | while (!list_empty(&p->work_list)) { | 572 | while (!list_empty(&p->work_list)) { |
575 | list_splice_init(&p->work_list, &work_list); | 573 | list_splice_init(&p->work_list, &work_list); |
@@ -583,10 +581,10 @@ int bnx2fc_percpu_io_thread(void *arg) | |||
583 | 581 | ||
584 | spin_lock_bh(&p->fp_work_lock); | 582 | spin_lock_bh(&p->fp_work_lock); |
585 | } | 583 | } |
584 | __set_current_state(TASK_INTERRUPTIBLE); | ||
586 | spin_unlock_bh(&p->fp_work_lock); | 585 | spin_unlock_bh(&p->fp_work_lock); |
587 | set_current_state(TASK_INTERRUPTIBLE); | ||
588 | } | 586 | } |
589 | set_current_state(TASK_RUNNING); | 587 | __set_current_state(TASK_RUNNING); |
590 | 588 | ||
591 | return 0; | 589 | return 0; |
592 | } | 590 | } |
@@ -661,31 +659,6 @@ static int bnx2fc_shost_config(struct fc_lport *lport, struct device *dev) | |||
661 | return 0; | 659 | return 0; |
662 | } | 660 | } |
663 | 661 | ||
664 | static int bnx2fc_mfs_update(struct fc_lport *lport) | ||
665 | { | ||
666 | struct fcoe_port *port = lport_priv(lport); | ||
667 | struct bnx2fc_hba *hba = port->priv; | ||
668 | struct net_device *netdev = hba->netdev; | ||
669 | u32 mfs; | ||
670 | u32 max_mfs; | ||
671 | |||
672 | mfs = netdev->mtu - (sizeof(struct fcoe_hdr) + | ||
673 | sizeof(struct fcoe_crc_eof)); | ||
674 | max_mfs = BNX2FC_MAX_PAYLOAD + sizeof(struct fc_frame_header); | ||
675 | BNX2FC_HBA_DBG(lport, "mfs = %d, max_mfs = %d\n", mfs, max_mfs); | ||
676 | if (mfs > max_mfs) | ||
677 | mfs = max_mfs; | ||
678 | |||
679 | /* Adjust mfs to be a multiple of 256 bytes */ | ||
680 | mfs = (((mfs - sizeof(struct fc_frame_header)) / BNX2FC_MIN_PAYLOAD) * | ||
681 | BNX2FC_MIN_PAYLOAD); | ||
682 | mfs = mfs + sizeof(struct fc_frame_header); | ||
683 | |||
684 | BNX2FC_HBA_DBG(lport, "Set MFS = %d\n", mfs); | ||
685 | if (fc_set_mfs(lport, mfs)) | ||
686 | return -EINVAL; | ||
687 | return 0; | ||
688 | } | ||
689 | static void bnx2fc_link_speed_update(struct fc_lport *lport) | 662 | static void bnx2fc_link_speed_update(struct fc_lport *lport) |
690 | { | 663 | { |
691 | struct fcoe_port *port = lport_priv(lport); | 664 | struct fcoe_port *port = lport_priv(lport); |
@@ -754,7 +727,7 @@ static int bnx2fc_net_config(struct fc_lport *lport) | |||
754 | !hba->phys_dev->ethtool_ops->get_pauseparam) | 727 | !hba->phys_dev->ethtool_ops->get_pauseparam) |
755 | return -EOPNOTSUPP; | 728 | return -EOPNOTSUPP; |
756 | 729 | ||
757 | if (bnx2fc_mfs_update(lport)) | 730 | if (fc_set_mfs(lport, BNX2FC_MFS)) |
758 | return -EINVAL; | 731 | return -EINVAL; |
759 | 732 | ||
760 | skb_queue_head_init(&port->fcoe_pending_queue); | 733 | skb_queue_head_init(&port->fcoe_pending_queue); |
@@ -825,14 +798,6 @@ static void bnx2fc_indicate_netevent(void *context, unsigned long event) | |||
825 | if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state)) | 798 | if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state)) |
826 | printk(KERN_ERR "indicate_netevent: "\ | 799 | printk(KERN_ERR "indicate_netevent: "\ |
827 | "adapter is not UP!!\n"); | 800 | "adapter is not UP!!\n"); |
828 | /* fall thru to update mfs if MTU has changed */ | ||
829 | case NETDEV_CHANGEMTU: | ||
830 | BNX2FC_HBA_DBG(lport, "NETDEV_CHANGEMTU event\n"); | ||
831 | bnx2fc_mfs_update(lport); | ||
832 | mutex_lock(&lport->lp_mutex); | ||
833 | list_for_each_entry(vport, &lport->vports, list) | ||
834 | bnx2fc_mfs_update(vport); | ||
835 | mutex_unlock(&lport->lp_mutex); | ||
836 | break; | 801 | break; |
837 | 802 | ||
838 | case NETDEV_DOWN: | 803 | case NETDEV_DOWN: |
@@ -1095,13 +1060,6 @@ static int bnx2fc_netdev_setup(struct bnx2fc_hba *hba) | |||
1095 | struct netdev_hw_addr *ha; | 1060 | struct netdev_hw_addr *ha; |
1096 | int sel_san_mac = 0; | 1061 | int sel_san_mac = 0; |
1097 | 1062 | ||
1098 | /* Do not support for bonding device */ | ||
1099 | if ((netdev->priv_flags & IFF_MASTER_ALB) || | ||
1100 | (netdev->priv_flags & IFF_SLAVE_INACTIVE) || | ||
1101 | (netdev->priv_flags & IFF_MASTER_8023AD)) { | ||
1102 | return -EOPNOTSUPP; | ||
1103 | } | ||
1104 | |||
1105 | /* setup Source MAC Address */ | 1063 | /* setup Source MAC Address */ |
1106 | rcu_read_lock(); | 1064 | rcu_read_lock(); |
1107 | for_each_dev_addr(physdev, ha) { | 1065 | for_each_dev_addr(physdev, ha) { |
@@ -1432,16 +1390,9 @@ static int bnx2fc_destroy(struct net_device *netdev) | |||
1432 | struct net_device *phys_dev; | 1390 | struct net_device *phys_dev; |
1433 | int rc = 0; | 1391 | int rc = 0; |
1434 | 1392 | ||
1435 | if (!rtnl_trylock()) | 1393 | rtnl_lock(); |
1436 | return restart_syscall(); | ||
1437 | 1394 | ||
1438 | mutex_lock(&bnx2fc_dev_lock); | 1395 | mutex_lock(&bnx2fc_dev_lock); |
1439 | #ifdef CONFIG_SCSI_BNX2X_FCOE_MODULE | ||
1440 | if (THIS_MODULE->state != MODULE_STATE_LIVE) { | ||
1441 | rc = -ENODEV; | ||
1442 | goto netdev_err; | ||
1443 | } | ||
1444 | #endif | ||
1445 | /* obtain physical netdev */ | 1396 | /* obtain physical netdev */ |
1446 | if (netdev->priv_flags & IFF_802_1Q_VLAN) | 1397 | if (netdev->priv_flags & IFF_802_1Q_VLAN) |
1447 | phys_dev = vlan_dev_real_dev(netdev); | 1398 | phys_dev = vlan_dev_real_dev(netdev); |
@@ -1805,18 +1756,10 @@ static int bnx2fc_disable(struct net_device *netdev) | |||
1805 | struct ethtool_drvinfo drvinfo; | 1756 | struct ethtool_drvinfo drvinfo; |
1806 | int rc = 0; | 1757 | int rc = 0; |
1807 | 1758 | ||
1808 | if (!rtnl_trylock()) { | 1759 | rtnl_lock(); |
1809 | printk(KERN_ERR PFX "retrying for rtnl_lock\n"); | ||
1810 | return -EIO; | ||
1811 | } | ||
1812 | 1760 | ||
1813 | mutex_lock(&bnx2fc_dev_lock); | 1761 | mutex_lock(&bnx2fc_dev_lock); |
1814 | 1762 | ||
1815 | if (THIS_MODULE->state != MODULE_STATE_LIVE) { | ||
1816 | rc = -ENODEV; | ||
1817 | goto nodev; | ||
1818 | } | ||
1819 | |||
1820 | /* obtain physical netdev */ | 1763 | /* obtain physical netdev */ |
1821 | if (netdev->priv_flags & IFF_802_1Q_VLAN) | 1764 | if (netdev->priv_flags & IFF_802_1Q_VLAN) |
1822 | phys_dev = vlan_dev_real_dev(netdev); | 1765 | phys_dev = vlan_dev_real_dev(netdev); |
@@ -1867,19 +1810,11 @@ static int bnx2fc_enable(struct net_device *netdev) | |||
1867 | struct ethtool_drvinfo drvinfo; | 1810 | struct ethtool_drvinfo drvinfo; |
1868 | int rc = 0; | 1811 | int rc = 0; |
1869 | 1812 | ||
1870 | if (!rtnl_trylock()) { | 1813 | rtnl_lock(); |
1871 | printk(KERN_ERR PFX "retrying for rtnl_lock\n"); | ||
1872 | return -EIO; | ||
1873 | } | ||
1874 | 1814 | ||
1875 | BNX2FC_MISC_DBG("Entered %s\n", __func__); | 1815 | BNX2FC_MISC_DBG("Entered %s\n", __func__); |
1876 | mutex_lock(&bnx2fc_dev_lock); | 1816 | mutex_lock(&bnx2fc_dev_lock); |
1877 | 1817 | ||
1878 | if (THIS_MODULE->state != MODULE_STATE_LIVE) { | ||
1879 | rc = -ENODEV; | ||
1880 | goto nodev; | ||
1881 | } | ||
1882 | |||
1883 | /* obtain physical netdev */ | 1818 | /* obtain physical netdev */ |
1884 | if (netdev->priv_flags & IFF_802_1Q_VLAN) | 1819 | if (netdev->priv_flags & IFF_802_1Q_VLAN) |
1885 | phys_dev = vlan_dev_real_dev(netdev); | 1820 | phys_dev = vlan_dev_real_dev(netdev); |
@@ -1942,18 +1877,9 @@ static int bnx2fc_create(struct net_device *netdev, enum fip_state fip_mode) | |||
1942 | return -EIO; | 1877 | return -EIO; |
1943 | } | 1878 | } |
1944 | 1879 | ||
1945 | if (!rtnl_trylock()) { | 1880 | rtnl_lock(); |
1946 | printk(KERN_ERR "trying for rtnl_lock\n"); | ||
1947 | return -EIO; | ||
1948 | } | ||
1949 | mutex_lock(&bnx2fc_dev_lock); | ||
1950 | 1881 | ||
1951 | #ifdef CONFIG_SCSI_BNX2X_FCOE_MODULE | 1882 | mutex_lock(&bnx2fc_dev_lock); |
1952 | if (THIS_MODULE->state != MODULE_STATE_LIVE) { | ||
1953 | rc = -ENODEV; | ||
1954 | goto mod_err; | ||
1955 | } | ||
1956 | #endif | ||
1957 | 1883 | ||
1958 | if (!try_module_get(THIS_MODULE)) { | 1884 | if (!try_module_get(THIS_MODULE)) { |
1959 | rc = -EINVAL; | 1885 | rc = -EINVAL; |
@@ -2506,7 +2432,7 @@ static struct scsi_host_template bnx2fc_shost_template = { | |||
2506 | .change_queue_type = fc_change_queue_type, | 2432 | .change_queue_type = fc_change_queue_type, |
2507 | .this_id = -1, | 2433 | .this_id = -1, |
2508 | .cmd_per_lun = 3, | 2434 | .cmd_per_lun = 3, |
2509 | .can_queue = (BNX2FC_MAX_OUTSTANDING_CMNDS/2), | 2435 | .can_queue = BNX2FC_CAN_QUEUE, |
2510 | .use_clustering = ENABLE_CLUSTERING, | 2436 | .use_clustering = ENABLE_CLUSTERING, |
2511 | .sg_tablesize = BNX2FC_MAX_BDS_PER_CMD, | 2437 | .sg_tablesize = BNX2FC_MAX_BDS_PER_CMD, |
2512 | .max_sectors = 512, | 2438 | .max_sectors = 512, |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_hwi.c b/drivers/scsi/bnx2fc/bnx2fc_hwi.c index 4f4096836742..1b680e288c56 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_hwi.c +++ b/drivers/scsi/bnx2fc/bnx2fc_hwi.c | |||
@@ -87,7 +87,7 @@ int bnx2fc_send_fw_fcoe_init_msg(struct bnx2fc_hba *hba) | |||
87 | fcoe_init1.task_list_pbl_addr_lo = (u32) hba->task_ctx_bd_dma; | 87 | fcoe_init1.task_list_pbl_addr_lo = (u32) hba->task_ctx_bd_dma; |
88 | fcoe_init1.task_list_pbl_addr_hi = | 88 | fcoe_init1.task_list_pbl_addr_hi = |
89 | (u32) ((u64) hba->task_ctx_bd_dma >> 32); | 89 | (u32) ((u64) hba->task_ctx_bd_dma >> 32); |
90 | fcoe_init1.mtu = hba->netdev->mtu; | 90 | fcoe_init1.mtu = BNX2FC_MINI_JUMBO_MTU; |
91 | 91 | ||
92 | fcoe_init1.flags = (PAGE_SHIFT << | 92 | fcoe_init1.flags = (PAGE_SHIFT << |
93 | FCOE_KWQE_INIT1_LOG_PAGE_SIZE_SHIFT); | 93 | FCOE_KWQE_INIT1_LOG_PAGE_SIZE_SHIFT); |
@@ -590,7 +590,10 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe) | |||
590 | 590 | ||
591 | num_rq = (frame_len + BNX2FC_RQ_BUF_SZ - 1) / BNX2FC_RQ_BUF_SZ; | 591 | num_rq = (frame_len + BNX2FC_RQ_BUF_SZ - 1) / BNX2FC_RQ_BUF_SZ; |
592 | 592 | ||
593 | spin_lock_bh(&tgt->tgt_lock); | ||
593 | rq_data = (unsigned char *)bnx2fc_get_next_rqe(tgt, num_rq); | 594 | rq_data = (unsigned char *)bnx2fc_get_next_rqe(tgt, num_rq); |
595 | spin_unlock_bh(&tgt->tgt_lock); | ||
596 | |||
594 | if (rq_data) { | 597 | if (rq_data) { |
595 | buf = rq_data; | 598 | buf = rq_data; |
596 | } else { | 599 | } else { |
@@ -603,8 +606,10 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe) | |||
603 | } | 606 | } |
604 | 607 | ||
605 | for (i = 0; i < num_rq; i++) { | 608 | for (i = 0; i < num_rq; i++) { |
609 | spin_lock_bh(&tgt->tgt_lock); | ||
606 | rq_data = (unsigned char *) | 610 | rq_data = (unsigned char *) |
607 | bnx2fc_get_next_rqe(tgt, 1); | 611 | bnx2fc_get_next_rqe(tgt, 1); |
612 | spin_unlock_bh(&tgt->tgt_lock); | ||
608 | len = BNX2FC_RQ_BUF_SZ; | 613 | len = BNX2FC_RQ_BUF_SZ; |
609 | memcpy(buf1, rq_data, len); | 614 | memcpy(buf1, rq_data, len); |
610 | buf1 += len; | 615 | buf1 += len; |
@@ -615,13 +620,15 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe) | |||
615 | 620 | ||
616 | if (buf != rq_data) | 621 | if (buf != rq_data) |
617 | kfree(buf); | 622 | kfree(buf); |
623 | spin_lock_bh(&tgt->tgt_lock); | ||
618 | bnx2fc_return_rqe(tgt, num_rq); | 624 | bnx2fc_return_rqe(tgt, num_rq); |
625 | spin_unlock_bh(&tgt->tgt_lock); | ||
619 | break; | 626 | break; |
620 | 627 | ||
621 | case FCOE_ERROR_DETECTION_CQE_TYPE: | 628 | case FCOE_ERROR_DETECTION_CQE_TYPE: |
622 | /* | 629 | /* |
623 | *In case of error reporting CQE a single RQ entry | 630 | * In case of error reporting CQE a single RQ entry |
624 | * is consumes. | 631 | * is consumed. |
625 | */ | 632 | */ |
626 | spin_lock_bh(&tgt->tgt_lock); | 633 | spin_lock_bh(&tgt->tgt_lock); |
627 | num_rq = 1; | 634 | num_rq = 1; |
@@ -705,6 +712,7 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe) | |||
705 | *In case of warning reporting CQE a single RQ entry | 712 | *In case of warning reporting CQE a single RQ entry |
706 | * is consumes. | 713 | * is consumes. |
707 | */ | 714 | */ |
715 | spin_lock_bh(&tgt->tgt_lock); | ||
708 | num_rq = 1; | 716 | num_rq = 1; |
709 | err_entry = (struct fcoe_err_report_entry *) | 717 | err_entry = (struct fcoe_err_report_entry *) |
710 | bnx2fc_get_next_rqe(tgt, 1); | 718 | bnx2fc_get_next_rqe(tgt, 1); |
@@ -717,6 +725,7 @@ static void bnx2fc_process_unsol_compl(struct bnx2fc_rport *tgt, u16 wqe) | |||
717 | err_entry->tx_buf_off, err_entry->rx_buf_off); | 725 | err_entry->tx_buf_off, err_entry->rx_buf_off); |
718 | 726 | ||
719 | bnx2fc_return_rqe(tgt, 1); | 727 | bnx2fc_return_rqe(tgt, 1); |
728 | spin_unlock_bh(&tgt->tgt_lock); | ||
720 | break; | 729 | break; |
721 | 730 | ||
722 | default: | 731 | default: |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_io.c b/drivers/scsi/bnx2fc/bnx2fc_io.c index 0f1dd23730db..1decefbf32e3 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_io.c +++ b/drivers/scsi/bnx2fc/bnx2fc_io.c | |||
@@ -11,6 +11,9 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include "bnx2fc.h" | 13 | #include "bnx2fc.h" |
14 | |||
15 | #define RESERVE_FREE_LIST_INDEX num_possible_cpus() | ||
16 | |||
14 | static int bnx2fc_split_bd(struct bnx2fc_cmd *io_req, u64 addr, int sg_len, | 17 | static int bnx2fc_split_bd(struct bnx2fc_cmd *io_req, u64 addr, int sg_len, |
15 | int bd_index); | 18 | int bd_index); |
16 | static int bnx2fc_map_sg(struct bnx2fc_cmd *io_req); | 19 | static int bnx2fc_map_sg(struct bnx2fc_cmd *io_req); |
@@ -242,8 +245,9 @@ struct bnx2fc_cmd_mgr *bnx2fc_cmd_mgr_alloc(struct bnx2fc_hba *hba, | |||
242 | u32 mem_size; | 245 | u32 mem_size; |
243 | u16 xid; | 246 | u16 xid; |
244 | int i; | 247 | int i; |
245 | int num_ios; | 248 | int num_ios, num_pri_ios; |
246 | size_t bd_tbl_sz; | 249 | size_t bd_tbl_sz; |
250 | int arr_sz = num_possible_cpus() + 1; | ||
247 | 251 | ||
248 | if (max_xid <= min_xid || max_xid == FC_XID_UNKNOWN) { | 252 | if (max_xid <= min_xid || max_xid == FC_XID_UNKNOWN) { |
249 | printk(KERN_ERR PFX "cmd_mgr_alloc: Invalid min_xid 0x%x \ | 253 | printk(KERN_ERR PFX "cmd_mgr_alloc: Invalid min_xid 0x%x \ |
@@ -263,14 +267,14 @@ struct bnx2fc_cmd_mgr *bnx2fc_cmd_mgr_alloc(struct bnx2fc_hba *hba, | |||
263 | } | 267 | } |
264 | 268 | ||
265 | cmgr->free_list = kzalloc(sizeof(*cmgr->free_list) * | 269 | cmgr->free_list = kzalloc(sizeof(*cmgr->free_list) * |
266 | num_possible_cpus(), GFP_KERNEL); | 270 | arr_sz, GFP_KERNEL); |
267 | if (!cmgr->free_list) { | 271 | if (!cmgr->free_list) { |
268 | printk(KERN_ERR PFX "failed to alloc free_list\n"); | 272 | printk(KERN_ERR PFX "failed to alloc free_list\n"); |
269 | goto mem_err; | 273 | goto mem_err; |
270 | } | 274 | } |
271 | 275 | ||
272 | cmgr->free_list_lock = kzalloc(sizeof(*cmgr->free_list_lock) * | 276 | cmgr->free_list_lock = kzalloc(sizeof(*cmgr->free_list_lock) * |
273 | num_possible_cpus(), GFP_KERNEL); | 277 | arr_sz, GFP_KERNEL); |
274 | if (!cmgr->free_list_lock) { | 278 | if (!cmgr->free_list_lock) { |
275 | printk(KERN_ERR PFX "failed to alloc free_list_lock\n"); | 279 | printk(KERN_ERR PFX "failed to alloc free_list_lock\n"); |
276 | goto mem_err; | 280 | goto mem_err; |
@@ -279,13 +283,18 @@ struct bnx2fc_cmd_mgr *bnx2fc_cmd_mgr_alloc(struct bnx2fc_hba *hba, | |||
279 | cmgr->hba = hba; | 283 | cmgr->hba = hba; |
280 | cmgr->cmds = (struct bnx2fc_cmd **)(cmgr + 1); | 284 | cmgr->cmds = (struct bnx2fc_cmd **)(cmgr + 1); |
281 | 285 | ||
282 | for (i = 0; i < num_possible_cpus(); i++) { | 286 | for (i = 0; i < arr_sz; i++) { |
283 | INIT_LIST_HEAD(&cmgr->free_list[i]); | 287 | INIT_LIST_HEAD(&cmgr->free_list[i]); |
284 | spin_lock_init(&cmgr->free_list_lock[i]); | 288 | spin_lock_init(&cmgr->free_list_lock[i]); |
285 | } | 289 | } |
286 | 290 | ||
287 | /* Pre-allocated pool of bnx2fc_cmds */ | 291 | /* |
292 | * Pre-allocated pool of bnx2fc_cmds. | ||
293 | * Last entry in the free list array is the free list | ||
294 | * of slow path requests. | ||
295 | */ | ||
288 | xid = BNX2FC_MIN_XID; | 296 | xid = BNX2FC_MIN_XID; |
297 | num_pri_ios = num_ios - BNX2FC_ELSTM_XIDS; | ||
289 | for (i = 0; i < num_ios; i++) { | 298 | for (i = 0; i < num_ios; i++) { |
290 | io_req = kzalloc(sizeof(*io_req), GFP_KERNEL); | 299 | io_req = kzalloc(sizeof(*io_req), GFP_KERNEL); |
291 | 300 | ||
@@ -298,11 +307,13 @@ struct bnx2fc_cmd_mgr *bnx2fc_cmd_mgr_alloc(struct bnx2fc_hba *hba, | |||
298 | INIT_DELAYED_WORK(&io_req->timeout_work, bnx2fc_cmd_timeout); | 307 | INIT_DELAYED_WORK(&io_req->timeout_work, bnx2fc_cmd_timeout); |
299 | 308 | ||
300 | io_req->xid = xid++; | 309 | io_req->xid = xid++; |
301 | if (io_req->xid >= BNX2FC_MAX_OUTSTANDING_CMNDS) | 310 | if (i < num_pri_ios) |
302 | printk(KERN_ERR PFX "ERROR allocating xids - 0x%x\n", | 311 | list_add_tail(&io_req->link, |
303 | io_req->xid); | 312 | &cmgr->free_list[io_req->xid % |
304 | list_add_tail(&io_req->link, | 313 | num_possible_cpus()]); |
305 | &cmgr->free_list[io_req->xid % num_possible_cpus()]); | 314 | else |
315 | list_add_tail(&io_req->link, | ||
316 | &cmgr->free_list[num_possible_cpus()]); | ||
306 | io_req++; | 317 | io_req++; |
307 | } | 318 | } |
308 | 319 | ||
@@ -389,7 +400,7 @@ free_cmd_pool: | |||
389 | if (!cmgr->free_list) | 400 | if (!cmgr->free_list) |
390 | goto free_cmgr; | 401 | goto free_cmgr; |
391 | 402 | ||
392 | for (i = 0; i < num_possible_cpus(); i++) { | 403 | for (i = 0; i < num_possible_cpus() + 1; i++) { |
393 | struct list_head *list; | 404 | struct list_head *list; |
394 | struct list_head *tmp; | 405 | struct list_head *tmp; |
395 | 406 | ||
@@ -413,6 +424,7 @@ struct bnx2fc_cmd *bnx2fc_elstm_alloc(struct bnx2fc_rport *tgt, int type) | |||
413 | struct bnx2fc_cmd *io_req; | 424 | struct bnx2fc_cmd *io_req; |
414 | struct list_head *listp; | 425 | struct list_head *listp; |
415 | struct io_bdt *bd_tbl; | 426 | struct io_bdt *bd_tbl; |
427 | int index = RESERVE_FREE_LIST_INDEX; | ||
416 | u32 max_sqes; | 428 | u32 max_sqes; |
417 | u16 xid; | 429 | u16 xid; |
418 | 430 | ||
@@ -432,26 +444,26 @@ struct bnx2fc_cmd *bnx2fc_elstm_alloc(struct bnx2fc_rport *tgt, int type) | |||
432 | * NOTE: Free list insertions and deletions are protected with | 444 | * NOTE: Free list insertions and deletions are protected with |
433 | * cmgr lock | 445 | * cmgr lock |
434 | */ | 446 | */ |
435 | spin_lock_bh(&cmd_mgr->free_list_lock[smp_processor_id()]); | 447 | spin_lock_bh(&cmd_mgr->free_list_lock[index]); |
436 | if ((list_empty(&(cmd_mgr->free_list[smp_processor_id()]))) || | 448 | if ((list_empty(&(cmd_mgr->free_list[index]))) || |
437 | (tgt->num_active_ios.counter >= max_sqes)) { | 449 | (tgt->num_active_ios.counter >= max_sqes)) { |
438 | BNX2FC_TGT_DBG(tgt, "No free els_tm cmds available " | 450 | BNX2FC_TGT_DBG(tgt, "No free els_tm cmds available " |
439 | "ios(%d):sqes(%d)\n", | 451 | "ios(%d):sqes(%d)\n", |
440 | tgt->num_active_ios.counter, tgt->max_sqes); | 452 | tgt->num_active_ios.counter, tgt->max_sqes); |
441 | if (list_empty(&(cmd_mgr->free_list[smp_processor_id()]))) | 453 | if (list_empty(&(cmd_mgr->free_list[index]))) |
442 | printk(KERN_ERR PFX "elstm_alloc: list_empty\n"); | 454 | printk(KERN_ERR PFX "elstm_alloc: list_empty\n"); |
443 | spin_unlock_bh(&cmd_mgr->free_list_lock[smp_processor_id()]); | 455 | spin_unlock_bh(&cmd_mgr->free_list_lock[index]); |
444 | return NULL; | 456 | return NULL; |
445 | } | 457 | } |
446 | 458 | ||
447 | listp = (struct list_head *) | 459 | listp = (struct list_head *) |
448 | cmd_mgr->free_list[smp_processor_id()].next; | 460 | cmd_mgr->free_list[index].next; |
449 | list_del_init(listp); | 461 | list_del_init(listp); |
450 | io_req = (struct bnx2fc_cmd *) listp; | 462 | io_req = (struct bnx2fc_cmd *) listp; |
451 | xid = io_req->xid; | 463 | xid = io_req->xid; |
452 | cmd_mgr->cmds[xid] = io_req; | 464 | cmd_mgr->cmds[xid] = io_req; |
453 | atomic_inc(&tgt->num_active_ios); | 465 | atomic_inc(&tgt->num_active_ios); |
454 | spin_unlock_bh(&cmd_mgr->free_list_lock[smp_processor_id()]); | 466 | spin_unlock_bh(&cmd_mgr->free_list_lock[index]); |
455 | 467 | ||
456 | INIT_LIST_HEAD(&io_req->link); | 468 | INIT_LIST_HEAD(&io_req->link); |
457 | 469 | ||
@@ -479,27 +491,30 @@ static struct bnx2fc_cmd *bnx2fc_cmd_alloc(struct bnx2fc_rport *tgt) | |||
479 | struct io_bdt *bd_tbl; | 491 | struct io_bdt *bd_tbl; |
480 | u32 max_sqes; | 492 | u32 max_sqes; |
481 | u16 xid; | 493 | u16 xid; |
494 | int index = get_cpu(); | ||
482 | 495 | ||
483 | max_sqes = BNX2FC_SCSI_MAX_SQES; | 496 | max_sqes = BNX2FC_SCSI_MAX_SQES; |
484 | /* | 497 | /* |
485 | * NOTE: Free list insertions and deletions are protected with | 498 | * NOTE: Free list insertions and deletions are protected with |
486 | * cmgr lock | 499 | * cmgr lock |
487 | */ | 500 | */ |
488 | spin_lock_bh(&cmd_mgr->free_list_lock[smp_processor_id()]); | 501 | spin_lock_bh(&cmd_mgr->free_list_lock[index]); |
489 | if ((list_empty(&cmd_mgr->free_list[smp_processor_id()])) || | 502 | if ((list_empty(&cmd_mgr->free_list[index])) || |
490 | (tgt->num_active_ios.counter >= max_sqes)) { | 503 | (tgt->num_active_ios.counter >= max_sqes)) { |
491 | spin_unlock_bh(&cmd_mgr->free_list_lock[smp_processor_id()]); | 504 | spin_unlock_bh(&cmd_mgr->free_list_lock[index]); |
505 | put_cpu(); | ||
492 | return NULL; | 506 | return NULL; |
493 | } | 507 | } |
494 | 508 | ||
495 | listp = (struct list_head *) | 509 | listp = (struct list_head *) |
496 | cmd_mgr->free_list[smp_processor_id()].next; | 510 | cmd_mgr->free_list[index].next; |
497 | list_del_init(listp); | 511 | list_del_init(listp); |
498 | io_req = (struct bnx2fc_cmd *) listp; | 512 | io_req = (struct bnx2fc_cmd *) listp; |
499 | xid = io_req->xid; | 513 | xid = io_req->xid; |
500 | cmd_mgr->cmds[xid] = io_req; | 514 | cmd_mgr->cmds[xid] = io_req; |
501 | atomic_inc(&tgt->num_active_ios); | 515 | atomic_inc(&tgt->num_active_ios); |
502 | spin_unlock_bh(&cmd_mgr->free_list_lock[smp_processor_id()]); | 516 | spin_unlock_bh(&cmd_mgr->free_list_lock[index]); |
517 | put_cpu(); | ||
503 | 518 | ||
504 | INIT_LIST_HEAD(&io_req->link); | 519 | INIT_LIST_HEAD(&io_req->link); |
505 | 520 | ||
@@ -522,8 +537,15 @@ void bnx2fc_cmd_release(struct kref *ref) | |||
522 | struct bnx2fc_cmd *io_req = container_of(ref, | 537 | struct bnx2fc_cmd *io_req = container_of(ref, |
523 | struct bnx2fc_cmd, refcount); | 538 | struct bnx2fc_cmd, refcount); |
524 | struct bnx2fc_cmd_mgr *cmd_mgr = io_req->cmd_mgr; | 539 | struct bnx2fc_cmd_mgr *cmd_mgr = io_req->cmd_mgr; |
540 | int index; | ||
541 | |||
542 | if (io_req->cmd_type == BNX2FC_SCSI_CMD) | ||
543 | index = io_req->xid % num_possible_cpus(); | ||
544 | else | ||
545 | index = RESERVE_FREE_LIST_INDEX; | ||
525 | 546 | ||
526 | spin_lock_bh(&cmd_mgr->free_list_lock[smp_processor_id()]); | 547 | |
548 | spin_lock_bh(&cmd_mgr->free_list_lock[index]); | ||
527 | if (io_req->cmd_type != BNX2FC_SCSI_CMD) | 549 | if (io_req->cmd_type != BNX2FC_SCSI_CMD) |
528 | bnx2fc_free_mp_resc(io_req); | 550 | bnx2fc_free_mp_resc(io_req); |
529 | cmd_mgr->cmds[io_req->xid] = NULL; | 551 | cmd_mgr->cmds[io_req->xid] = NULL; |
@@ -531,9 +553,10 @@ void bnx2fc_cmd_release(struct kref *ref) | |||
531 | list_del_init(&io_req->link); | 553 | list_del_init(&io_req->link); |
532 | /* Add it to the free list */ | 554 | /* Add it to the free list */ |
533 | list_add(&io_req->link, | 555 | list_add(&io_req->link, |
534 | &cmd_mgr->free_list[smp_processor_id()]); | 556 | &cmd_mgr->free_list[index]); |
535 | atomic_dec(&io_req->tgt->num_active_ios); | 557 | atomic_dec(&io_req->tgt->num_active_ios); |
536 | spin_unlock_bh(&cmd_mgr->free_list_lock[smp_processor_id()]); | 558 | spin_unlock_bh(&cmd_mgr->free_list_lock[index]); |
559 | |||
537 | } | 560 | } |
538 | 561 | ||
539 | static void bnx2fc_free_mp_resc(struct bnx2fc_cmd *io_req) | 562 | static void bnx2fc_free_mp_resc(struct bnx2fc_cmd *io_req) |
@@ -1250,7 +1273,7 @@ static void bnx2fc_lun_reset_cmpl(struct bnx2fc_cmd *io_req) | |||
1250 | bnx2fc_cmd_release); | 1273 | bnx2fc_cmd_release); |
1251 | /* timer hold */ | 1274 | /* timer hold */ |
1252 | rc = bnx2fc_initiate_abts(cmd); | 1275 | rc = bnx2fc_initiate_abts(cmd); |
1253 | /* abts shouldnt fail in this context */ | 1276 | /* abts shouldn't fail in this context */ |
1254 | WARN_ON(rc != SUCCESS); | 1277 | WARN_ON(rc != SUCCESS); |
1255 | } else | 1278 | } else |
1256 | printk(KERN_ERR PFX "lun_rst: abts already in" | 1279 | printk(KERN_ERR PFX "lun_rst: abts already in" |
@@ -1285,7 +1308,7 @@ static void bnx2fc_tgt_reset_cmpl(struct bnx2fc_cmd *io_req) | |||
1285 | kref_put(&io_req->refcount, | 1308 | kref_put(&io_req->refcount, |
1286 | bnx2fc_cmd_release); /* timer hold */ | 1309 | bnx2fc_cmd_release); /* timer hold */ |
1287 | rc = bnx2fc_initiate_abts(cmd); | 1310 | rc = bnx2fc_initiate_abts(cmd); |
1288 | /* abts shouldnt fail in this context */ | 1311 | /* abts shouldn't fail in this context */ |
1289 | WARN_ON(rc != SUCCESS); | 1312 | WARN_ON(rc != SUCCESS); |
1290 | 1313 | ||
1291 | } else | 1314 | } else |
diff --git a/drivers/scsi/bnx2fc/bnx2fc_tgt.c b/drivers/scsi/bnx2fc/bnx2fc_tgt.c index 7ea93af60260..a2e3830bd268 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_tgt.c +++ b/drivers/scsi/bnx2fc/bnx2fc_tgt.c | |||
@@ -304,10 +304,8 @@ static void bnx2fc_upload_session(struct fcoe_port *port, | |||
304 | " not sent to FW\n"); | 304 | " not sent to FW\n"); |
305 | 305 | ||
306 | /* Free session resources */ | 306 | /* Free session resources */ |
307 | spin_lock_bh(&tgt->cq_lock); | ||
308 | bnx2fc_free_session_resc(hba, tgt); | 307 | bnx2fc_free_session_resc(hba, tgt); |
309 | bnx2fc_free_conn_id(hba, tgt->fcoe_conn_id); | 308 | bnx2fc_free_conn_id(hba, tgt->fcoe_conn_id); |
310 | spin_unlock_bh(&tgt->cq_lock); | ||
311 | } | 309 | } |
312 | 310 | ||
313 | static int bnx2fc_init_tgt(struct bnx2fc_rport *tgt, | 311 | static int bnx2fc_init_tgt(struct bnx2fc_rport *tgt, |
@@ -397,7 +395,7 @@ void bnx2fc_rport_event_handler(struct fc_lport *lport, | |||
397 | rp = rport->dd_data; | 395 | rp = rport->dd_data; |
398 | if (rport->port_id == FC_FID_DIR_SERV) { | 396 | if (rport->port_id == FC_FID_DIR_SERV) { |
399 | /* | 397 | /* |
400 | * bnx2fc_rport structure doesnt exist for | 398 | * bnx2fc_rport structure doesn't exist for |
401 | * directory server. | 399 | * directory server. |
402 | * We should not come here, as lport will | 400 | * We should not come here, as lport will |
403 | * take care of fabric login | 401 | * take care of fabric login |
@@ -830,11 +828,13 @@ static void bnx2fc_free_session_resc(struct bnx2fc_hba *hba, | |||
830 | tgt->rq = NULL; | 828 | tgt->rq = NULL; |
831 | } | 829 | } |
832 | /* Free CQ */ | 830 | /* Free CQ */ |
831 | spin_lock_bh(&tgt->cq_lock); | ||
833 | if (tgt->cq) { | 832 | if (tgt->cq) { |
834 | dma_free_coherent(&hba->pcidev->dev, tgt->cq_mem_size, | 833 | dma_free_coherent(&hba->pcidev->dev, tgt->cq_mem_size, |
835 | tgt->cq, tgt->cq_dma); | 834 | tgt->cq, tgt->cq_dma); |
836 | tgt->cq = NULL; | 835 | tgt->cq = NULL; |
837 | } | 836 | } |
837 | spin_unlock_bh(&tgt->cq_lock); | ||
838 | /* Free SQ */ | 838 | /* Free SQ */ |
839 | if (tgt->sq) { | 839 | if (tgt->sq) { |
840 | dma_free_coherent(&hba->pcidev->dev, tgt->sq_mem_size, | 840 | dma_free_coherent(&hba->pcidev->dev, tgt->sq_mem_size, |
diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c index 1da34c019b8a..f0b89513faed 100644 --- a/drivers/scsi/bnx2i/bnx2i_hwi.c +++ b/drivers/scsi/bnx2i/bnx2i_hwi.c | |||
@@ -173,7 +173,7 @@ void bnx2i_arm_cq_event_coalescing(struct bnx2i_endpoint *ep, u8 action) | |||
173 | 173 | ||
174 | /** | 174 | /** |
175 | * bnx2i_get_rq_buf - copy RQ buffer contents to driver buffer | 175 | * bnx2i_get_rq_buf - copy RQ buffer contents to driver buffer |
176 | * @conn: iscsi connection on which RQ event occured | 176 | * @conn: iscsi connection on which RQ event occurred |
177 | * @ptr: driver buffer to which RQ buffer contents is to | 177 | * @ptr: driver buffer to which RQ buffer contents is to |
178 | * be copied | 178 | * be copied |
179 | * @len: length of valid data inside RQ buf | 179 | * @len: length of valid data inside RQ buf |
diff --git a/drivers/scsi/cxgbi/libcxgbi.h b/drivers/scsi/cxgbi/libcxgbi.h index 0a20fd5f7102..9267844519c9 100644 --- a/drivers/scsi/cxgbi/libcxgbi.h +++ b/drivers/scsi/cxgbi/libcxgbi.h | |||
@@ -262,9 +262,9 @@ struct cxgbi_skb_tx_cb { | |||
262 | enum cxgbi_skcb_flags { | 262 | enum cxgbi_skcb_flags { |
263 | SKCBF_TX_NEED_HDR, /* packet needs a header */ | 263 | SKCBF_TX_NEED_HDR, /* packet needs a header */ |
264 | SKCBF_RX_COALESCED, /* received whole pdu */ | 264 | SKCBF_RX_COALESCED, /* received whole pdu */ |
265 | SKCBF_RX_HDR, /* recieved pdu header */ | 265 | SKCBF_RX_HDR, /* received pdu header */ |
266 | SKCBF_RX_DATA, /* recieved pdu payload */ | 266 | SKCBF_RX_DATA, /* received pdu payload */ |
267 | SKCBF_RX_STATUS, /* recieved ddp status */ | 267 | SKCBF_RX_STATUS, /* received ddp status */ |
268 | SKCBF_RX_DATA_DDPD, /* pdu payload ddp'd */ | 268 | SKCBF_RX_DATA_DDPD, /* pdu payload ddp'd */ |
269 | SKCBF_RX_HCRC_ERR, /* header digest error */ | 269 | SKCBF_RX_HCRC_ERR, /* header digest error */ |
270 | SKCBF_RX_DCRC_ERR, /* data digest error */ | 270 | SKCBF_RX_DCRC_ERR, /* data digest error */ |
diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c index b0f8523e665f..b10b3841535c 100644 --- a/drivers/scsi/dc395x.c +++ b/drivers/scsi/dc395x.c | |||
@@ -235,7 +235,7 @@ struct ScsiReqBlk { | |||
235 | 235 | ||
236 | u8 sg_count; /* No of HW sg entries for this request */ | 236 | u8 sg_count; /* No of HW sg entries for this request */ |
237 | u8 sg_index; /* Index of HW sg entry for this request */ | 237 | u8 sg_index; /* Index of HW sg entry for this request */ |
238 | size_t total_xfer_length; /* Total number of bytes remaining to be transfered */ | 238 | size_t total_xfer_length; /* Total number of bytes remaining to be transferred */ |
239 | size_t request_length; /* Total number of bytes in this request */ | 239 | size_t request_length; /* Total number of bytes in this request */ |
240 | /* | 240 | /* |
241 | * The sense buffer handling function, request_sense, uses | 241 | * The sense buffer handling function, request_sense, uses |
@@ -1774,7 +1774,7 @@ static void dc395x_handle_interrupt(struct AdapterCtlBlk *acb, | |||
1774 | dc395x_statev(acb, srb, &scsi_status); | 1774 | dc395x_statev(acb, srb, &scsi_status); |
1775 | 1775 | ||
1776 | /* | 1776 | /* |
1777 | * if there were any exception occured scsi_status | 1777 | * if there were any exception occurred scsi_status |
1778 | * will be modify to bus free phase new scsi_status | 1778 | * will be modify to bus free phase new scsi_status |
1779 | * transfer out from ... previous dc395x_statev | 1779 | * transfer out from ... previous dc395x_statev |
1780 | */ | 1780 | */ |
@@ -1954,11 +1954,11 @@ static void sg_verify_length(struct ScsiReqBlk *srb) | |||
1954 | static void sg_update_list(struct ScsiReqBlk *srb, u32 left) | 1954 | static void sg_update_list(struct ScsiReqBlk *srb, u32 left) |
1955 | { | 1955 | { |
1956 | u8 idx; | 1956 | u8 idx; |
1957 | u32 xferred = srb->total_xfer_length - left; /* bytes transfered */ | 1957 | u32 xferred = srb->total_xfer_length - left; /* bytes transferred */ |
1958 | struct SGentry *psge = srb->segment_x + srb->sg_index; | 1958 | struct SGentry *psge = srb->segment_x + srb->sg_index; |
1959 | 1959 | ||
1960 | dprintkdbg(DBG_0, | 1960 | dprintkdbg(DBG_0, |
1961 | "sg_update_list: Transfered %i of %i bytes, %i remain\n", | 1961 | "sg_update_list: Transferred %i of %i bytes, %i remain\n", |
1962 | xferred, srb->total_xfer_length, left); | 1962 | xferred, srb->total_xfer_length, left); |
1963 | if (xferred == 0) { | 1963 | if (xferred == 0) { |
1964 | /* nothing to update since we did not transfer any data */ | 1964 | /* nothing to update since we did not transfer any data */ |
@@ -1990,7 +1990,7 @@ static void sg_update_list(struct ScsiReqBlk *srb, u32 left) | |||
1990 | 1990 | ||
1991 | 1991 | ||
1992 | /* | 1992 | /* |
1993 | * We have transfered a single byte (PIO mode?) and need to update | 1993 | * We have transferred a single byte (PIO mode?) and need to update |
1994 | * the count of bytes remaining (total_xfer_length) and update the sg | 1994 | * the count of bytes remaining (total_xfer_length) and update the sg |
1995 | * entry to either point to next byte in the current sg entry, or of | 1995 | * entry to either point to next byte in the current sg entry, or of |
1996 | * already at the end to point to the start of the next sg entry | 1996 | * already at the end to point to the start of the next sg entry |
@@ -2029,7 +2029,7 @@ static void cleanup_after_transfer(struct AdapterCtlBlk *acb, | |||
2029 | 2029 | ||
2030 | 2030 | ||
2031 | /* | 2031 | /* |
2032 | * Those no of bytes will be transfered w/ PIO through the SCSI FIFO | 2032 | * Those no of bytes will be transferred w/ PIO through the SCSI FIFO |
2033 | * Seems to be needed for unknown reasons; could be a hardware bug :-( | 2033 | * Seems to be needed for unknown reasons; could be a hardware bug :-( |
2034 | */ | 2034 | */ |
2035 | #define DC395x_LASTPIO 4 | 2035 | #define DC395x_LASTPIO 4 |
@@ -2256,7 +2256,7 @@ static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, | |||
2256 | DC395x_read32(acb, TRM_S1040_DMA_CXCNT), | 2256 | DC395x_read32(acb, TRM_S1040_DMA_CXCNT), |
2257 | srb->total_xfer_length, d_left_counter); | 2257 | srb->total_xfer_length, d_left_counter); |
2258 | #if DC395x_LASTPIO | 2258 | #if DC395x_LASTPIO |
2259 | /* KG: Less than or equal to 4 bytes can not be transfered via DMA, it seems. */ | 2259 | /* KG: Less than or equal to 4 bytes can not be transferred via DMA, it seems. */ |
2260 | if (d_left_counter | 2260 | if (d_left_counter |
2261 | && srb->total_xfer_length <= DC395x_LASTPIO) { | 2261 | && srb->total_xfer_length <= DC395x_LASTPIO) { |
2262 | size_t left_io = srb->total_xfer_length; | 2262 | size_t left_io = srb->total_xfer_length; |
diff --git a/drivers/scsi/dc395x.h b/drivers/scsi/dc395x.h index b38360e5fe4f..fbf35e37701e 100644 --- a/drivers/scsi/dc395x.h +++ b/drivers/scsi/dc395x.h | |||
@@ -617,7 +617,7 @@ struct ScsiInqData | |||
617 | #define NTC_DO_SEND_START 0x08 /* Send start command SPINUP */ | 617 | #define NTC_DO_SEND_START 0x08 /* Send start command SPINUP */ |
618 | #define NTC_DO_DISCONNECT 0x04 /* Enable SCSI disconnect */ | 618 | #define NTC_DO_DISCONNECT 0x04 /* Enable SCSI disconnect */ |
619 | #define NTC_DO_SYNC_NEGO 0x02 /* Sync negotiation */ | 619 | #define NTC_DO_SYNC_NEGO 0x02 /* Sync negotiation */ |
620 | #define NTC_DO_PARITY_CHK 0x01 /* (it sould define at NAC) */ | 620 | #define NTC_DO_PARITY_CHK 0x01 /* (it should define at NAC) */ |
621 | /* Parity check enable */ | 621 | /* Parity check enable */ |
622 | 622 | ||
623 | /************************************************************************/ | 623 | /************************************************************************/ |
diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c index 7cae0bc85390..42fe52902add 100644 --- a/drivers/scsi/device_handler/scsi_dh_alua.c +++ b/drivers/scsi/device_handler/scsi_dh_alua.c | |||
@@ -541,7 +541,7 @@ static int alua_check_sense(struct scsi_device *sdev, | |||
541 | * | 541 | * |
542 | * Evaluate the Target Port Group State. | 542 | * Evaluate the Target Port Group State. |
543 | * Returns SCSI_DH_DEV_OFFLINED if the path is | 543 | * Returns SCSI_DH_DEV_OFFLINED if the path is |
544 | * found to be unuseable. | 544 | * found to be unusable. |
545 | */ | 545 | */ |
546 | static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h) | 546 | static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h) |
547 | { | 547 | { |
@@ -620,7 +620,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h) | |||
620 | break; | 620 | break; |
621 | case TPGS_STATE_OFFLINE: | 621 | case TPGS_STATE_OFFLINE: |
622 | case TPGS_STATE_UNAVAILABLE: | 622 | case TPGS_STATE_UNAVAILABLE: |
623 | /* Path unuseable for unavailable/offline */ | 623 | /* Path unusable for unavailable/offline */ |
624 | err = SCSI_DH_DEV_OFFLINED; | 624 | err = SCSI_DH_DEV_OFFLINED; |
625 | break; | 625 | break; |
626 | default: | 626 | default: |
diff --git a/drivers/scsi/dpt/sys_info.h b/drivers/scsi/dpt/sys_info.h index a90c4cb8ea8b..a4aa1c31ff72 100644 --- a/drivers/scsi/dpt/sys_info.h +++ b/drivers/scsi/dpt/sys_info.h | |||
@@ -79,9 +79,9 @@ | |||
79 | typedef struct { | 79 | typedef struct { |
80 | #endif | 80 | #endif |
81 | 81 | ||
82 | uSHORT cylinders; /* Upto 1024 */ | 82 | uSHORT cylinders; /* Up to 1024 */ |
83 | uCHAR heads; /* Upto 255 */ | 83 | uCHAR heads; /* Up to 255 */ |
84 | uCHAR sectors; /* Upto 63 */ | 84 | uCHAR sectors; /* Up to 63 */ |
85 | 85 | ||
86 | #ifdef __cplusplus | 86 | #ifdef __cplusplus |
87 | 87 | ||
diff --git a/drivers/scsi/eata.c b/drivers/scsi/eata.c index 53925ac178fd..0eb4fe6a4c8a 100644 --- a/drivers/scsi/eata.c +++ b/drivers/scsi/eata.c | |||
@@ -63,7 +63,7 @@ | |||
63 | * ep:[y|n] eisa_probe=[1|0] CONFIG_EISA defined | 63 | * ep:[y|n] eisa_probe=[1|0] CONFIG_EISA defined |
64 | * pp:[y|n] pci_probe=[1|0] CONFIG_PCI defined | 64 | * pp:[y|n] pci_probe=[1|0] CONFIG_PCI defined |
65 | * | 65 | * |
66 | * The default action is to perform probing if the corrisponding | 66 | * The default action is to perform probing if the corresponding |
67 | * bus is configured and to skip probing otherwise. | 67 | * bus is configured and to skip probing otherwise. |
68 | * | 68 | * |
69 | * + If pci_probe is in effect and a list of I/O ports is specified | 69 | * + If pci_probe is in effect and a list of I/O ports is specified |
diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c index c93f007e702f..9d38be2a41f9 100644 --- a/drivers/scsi/fcoe/fcoe_ctlr.c +++ b/drivers/scsi/fcoe/fcoe_ctlr.c | |||
@@ -656,7 +656,7 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport, | |||
656 | * If non-FIP, we may have gotten an SID by accepting an FLOGI | 656 | * If non-FIP, we may have gotten an SID by accepting an FLOGI |
657 | * from a point-to-point connection. Switch to using | 657 | * from a point-to-point connection. Switch to using |
658 | * the source mac based on the SID. The destination | 658 | * the source mac based on the SID. The destination |
659 | * MAC in this case would have been set by receving the | 659 | * MAC in this case would have been set by receiving the |
660 | * FLOGI. | 660 | * FLOGI. |
661 | */ | 661 | */ |
662 | if (fip->state == FIP_ST_NON_FIP) { | 662 | if (fip->state == FIP_ST_NON_FIP) { |
@@ -1876,7 +1876,7 @@ static void fcoe_ctlr_vn_send(struct fcoe_ctlr *fip, | |||
1876 | * fcoe_ctlr_vn_rport_callback - Event handler for rport events. | 1876 | * fcoe_ctlr_vn_rport_callback - Event handler for rport events. |
1877 | * @lport: The lport which is receiving the event | 1877 | * @lport: The lport which is receiving the event |
1878 | * @rdata: remote port private data | 1878 | * @rdata: remote port private data |
1879 | * @event: The event that occured | 1879 | * @event: The event that occurred |
1880 | * | 1880 | * |
1881 | * Locking Note: The rport lock must not be held when calling this function. | 1881 | * Locking Note: The rport lock must not be held when calling this function. |
1882 | */ | 1882 | */ |
diff --git a/drivers/scsi/fdomain.c b/drivers/scsi/fdomain.c index 69b7aa54f43f..643f6d500fe7 100644 --- a/drivers/scsi/fdomain.c +++ b/drivers/scsi/fdomain.c | |||
@@ -174,7 +174,7 @@ | |||
174 | Future Domain sold DOS BIOS source for $250 and the UN*X driver source was | 174 | Future Domain sold DOS BIOS source for $250 and the UN*X driver source was |
175 | $750, but these required a non-disclosure agreement, so even if I could | 175 | $750, but these required a non-disclosure agreement, so even if I could |
176 | have afforded them, they would *not* have been useful for writing this | 176 | have afforded them, they would *not* have been useful for writing this |
177 | publically distributable driver. Future Domain technical support has | 177 | publicly distributable driver. Future Domain technical support has |
178 | provided some information on the phone and have sent a few useful FAXs. | 178 | provided some information on the phone and have sent a few useful FAXs. |
179 | They have been much more helpful since they started to recognize that the | 179 | They have been much more helpful since they started to recognize that the |
180 | word "Linux" refers to an operating system :-). | 180 | word "Linux" refers to an operating system :-). |
diff --git a/drivers/scsi/fnic/fnic_fcs.c b/drivers/scsi/fnic/fnic_fcs.c index 2b48d79bad94..3c53c3478ee7 100644 --- a/drivers/scsi/fnic/fnic_fcs.c +++ b/drivers/scsi/fnic/fnic_fcs.c | |||
@@ -411,7 +411,7 @@ int fnic_rq_cmpl_handler(struct fnic *fnic, int rq_work_to_do) | |||
411 | err = vnic_rq_fill(&fnic->rq[i], fnic_alloc_rq_frame); | 411 | err = vnic_rq_fill(&fnic->rq[i], fnic_alloc_rq_frame); |
412 | if (err) | 412 | if (err) |
413 | shost_printk(KERN_ERR, fnic->lport->host, | 413 | shost_printk(KERN_ERR, fnic->lport->host, |
414 | "fnic_alloc_rq_frame cant alloc" | 414 | "fnic_alloc_rq_frame can't alloc" |
415 | " frame\n"); | 415 | " frame\n"); |
416 | } | 416 | } |
417 | tot_rq_work_done += cur_work_done; | 417 | tot_rq_work_done += cur_work_done; |
diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c index 22d02404d15f..538b31c2cf58 100644 --- a/drivers/scsi/fnic/fnic_scsi.c +++ b/drivers/scsi/fnic/fnic_scsi.c | |||
@@ -1123,7 +1123,7 @@ void fnic_rport_exch_reset(struct fnic *fnic, u32 port_id) | |||
1123 | fc_lun.scsi_lun, io_req)) { | 1123 | fc_lun.scsi_lun, io_req)) { |
1124 | /* | 1124 | /* |
1125 | * Revert the cmd state back to old state, if | 1125 | * Revert the cmd state back to old state, if |
1126 | * it hasnt changed in between. This cmd will get | 1126 | * it hasn't changed in between. This cmd will get |
1127 | * aborted later by scsi_eh, or cleaned up during | 1127 | * aborted later by scsi_eh, or cleaned up during |
1128 | * lun reset | 1128 | * lun reset |
1129 | */ | 1129 | */ |
@@ -1208,7 +1208,7 @@ void fnic_terminate_rport_io(struct fc_rport *rport) | |||
1208 | fc_lun.scsi_lun, io_req)) { | 1208 | fc_lun.scsi_lun, io_req)) { |
1209 | /* | 1209 | /* |
1210 | * Revert the cmd state back to old state, if | 1210 | * Revert the cmd state back to old state, if |
1211 | * it hasnt changed in between. This cmd will get | 1211 | * it hasn't changed in between. This cmd will get |
1212 | * aborted later by scsi_eh, or cleaned up during | 1212 | * aborted later by scsi_eh, or cleaned up during |
1213 | * lun reset | 1213 | * lun reset |
1214 | */ | 1214 | */ |
diff --git a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c index 427a56d3117e..81182badfeb1 100644 --- a/drivers/scsi/g_NCR5380.c +++ b/drivers/scsi/g_NCR5380.c | |||
@@ -566,7 +566,7 @@ generic_NCR5380_biosparam(struct scsi_device *sdev, struct block_device *bdev, | |||
566 | * @dst: buffer to read into | 566 | * @dst: buffer to read into |
567 | * @len: buffer length | 567 | * @len: buffer length |
568 | * | 568 | * |
569 | * Perform a psuedo DMA mode read from an NCR53C400 or equivalent | 569 | * Perform a pseudo DMA mode read from an NCR53C400 or equivalent |
570 | * controller | 570 | * controller |
571 | */ | 571 | */ |
572 | 572 | ||
@@ -650,7 +650,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, | |||
650 | * @dst: buffer to read into | 650 | * @dst: buffer to read into |
651 | * @len: buffer length | 651 | * @len: buffer length |
652 | * | 652 | * |
653 | * Perform a psuedo DMA mode read from an NCR53C400 or equivalent | 653 | * Perform a pseudo DMA mode read from an NCR53C400 or equivalent |
654 | * controller | 654 | * controller |
655 | */ | 655 | */ |
656 | 656 | ||
diff --git a/drivers/scsi/gdth.h b/drivers/scsi/gdth.h index 120a0625a7b5..d969855ac64a 100644 --- a/drivers/scsi/gdth.h +++ b/drivers/scsi/gdth.h | |||
@@ -895,7 +895,7 @@ typedef struct { | |||
895 | u8 ldr_no; /* log. drive no. */ | 895 | u8 ldr_no; /* log. drive no. */ |
896 | u8 rw_attribs; /* r/w attributes */ | 896 | u8 rw_attribs; /* r/w attributes */ |
897 | u8 cluster_type; /* cluster properties */ | 897 | u8 cluster_type; /* cluster properties */ |
898 | u8 media_changed; /* Flag:MOUNT/UNMOUNT occured */ | 898 | u8 media_changed; /* Flag:MOUNT/UNMOUNT occurred */ |
899 | u32 start_sec; /* start sector */ | 899 | u32 start_sec; /* start sector */ |
900 | } hdr[MAX_LDRIVES]; /* host drives */ | 900 | } hdr[MAX_LDRIVES]; /* host drives */ |
901 | struct { | 901 | struct { |
diff --git a/drivers/scsi/gvp11.c b/drivers/scsi/gvp11.c index 2ce26eb7a1ec..50bb54150a78 100644 --- a/drivers/scsi/gvp11.c +++ b/drivers/scsi/gvp11.c | |||
@@ -300,7 +300,7 @@ static int __devinit gvp11_probe(struct zorro_dev *z, | |||
300 | /* | 300 | /* |
301 | * Rumors state that some GVP ram boards use the same product | 301 | * Rumors state that some GVP ram boards use the same product |
302 | * code as the SCSI controllers. Therefore if the board-size | 302 | * code as the SCSI controllers. Therefore if the board-size |
303 | * is not 64KB we asume it is a ram board and bail out. | 303 | * is not 64KB we assume it is a ram board and bail out. |
304 | */ | 304 | */ |
305 | if (zorro_resource_len(z) != 0x10000) | 305 | if (zorro_resource_len(z) != 0x10000) |
306 | return -ENODEV; | 306 | return -ENODEV; |
diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c index 99aa0e5699bc..26cd9d1d7571 100644 --- a/drivers/scsi/imm.c +++ b/drivers/scsi/imm.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * (The IMM is the embedded controller in the ZIP Plus drive.) | 4 | * (The IMM is the embedded controller in the ZIP Plus drive.) |
5 | * | 5 | * |
6 | * My unoffical company acronym list is 21 pages long: | 6 | * My unofficial company acronym list is 21 pages long: |
7 | * FLA: Four letter acronym with built in facility for | 7 | * FLA: Four letter acronym with built in facility for |
8 | * future expansion to five letters. | 8 | * future expansion to five letters. |
9 | */ | 9 | */ |
diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c index 9627d062e16b..dd741bcd6ccd 100644 --- a/drivers/scsi/initio.c +++ b/drivers/scsi/initio.c | |||
@@ -242,7 +242,7 @@ static u8 i91udftNvRam[64] = | |||
242 | 242 | ||
243 | static u8 initio_rate_tbl[8] = /* fast 20 */ | 243 | static u8 initio_rate_tbl[8] = /* fast 20 */ |
244 | { | 244 | { |
245 | /* nanosecond devide by 4 */ | 245 | /* nanosecond divide by 4 */ |
246 | 12, /* 50ns, 20M */ | 246 | 12, /* 50ns, 20M */ |
247 | 18, /* 75ns, 13.3M */ | 247 | 18, /* 75ns, 13.3M */ |
248 | 25, /* 100ns, 10M */ | 248 | 25, /* 100ns, 10M */ |
@@ -1917,7 +1917,7 @@ static int int_initio_scsi_rst(struct initio_host * host) | |||
1917 | } | 1917 | } |
1918 | 1918 | ||
1919 | /** | 1919 | /** |
1920 | * int_initio_scsi_resel - Reselection occured | 1920 | * int_initio_scsi_resel - Reselection occurred |
1921 | * @host: InitIO host adapter | 1921 | * @host: InitIO host adapter |
1922 | * | 1922 | * |
1923 | * A SCSI reselection event has been signalled and the interrupt | 1923 | * A SCSI reselection event has been signalled and the interrupt |
diff --git a/drivers/scsi/initio.h b/drivers/scsi/initio.h index e58af9e95506..219b901bdc25 100644 --- a/drivers/scsi/initio.h +++ b/drivers/scsi/initio.h | |||
@@ -116,7 +116,7 @@ typedef struct { | |||
116 | #define TUL_SBusId 0x89 /* 09 R SCSI BUS ID */ | 116 | #define TUL_SBusId 0x89 /* 09 R SCSI BUS ID */ |
117 | #define TUL_STimeOut 0x8A /* 0A W Sel/Resel Time Out Register */ | 117 | #define TUL_STimeOut 0x8A /* 0A W Sel/Resel Time Out Register */ |
118 | #define TUL_SIdent 0x8A /* 0A R Identify Message Register */ | 118 | #define TUL_SIdent 0x8A /* 0A R Identify Message Register */ |
119 | #define TUL_SAvail 0x8A /* 0A R Availiable Counter Register */ | 119 | #define TUL_SAvail 0x8A /* 0A R Available Counter Register */ |
120 | #define TUL_SData 0x8B /* 0B R/W SCSI data in/out */ | 120 | #define TUL_SData 0x8B /* 0B R/W SCSI data in/out */ |
121 | #define TUL_SFifo 0x8C /* 0C R/W FIFO */ | 121 | #define TUL_SFifo 0x8C /* 0C R/W FIFO */ |
122 | #define TUL_SSignal 0x90 /* 10 R/W SCSI signal in/out */ | 122 | #define TUL_SSignal 0x90 /* 10 R/W SCSI signal in/out */ |
@@ -389,7 +389,7 @@ struct scsi_ctrl_blk { | |||
389 | /* Bit Definition for status */ | 389 | /* Bit Definition for status */ |
390 | #define SCB_RENT 0x01 | 390 | #define SCB_RENT 0x01 |
391 | #define SCB_PEND 0x02 | 391 | #define SCB_PEND 0x02 |
392 | #define SCB_CONTIG 0x04 /* Contigent Allegiance */ | 392 | #define SCB_CONTIG 0x04 /* Contingent Allegiance */ |
393 | #define SCB_SELECT 0x08 | 393 | #define SCB_SELECT 0x08 |
394 | #define SCB_BUSY 0x10 | 394 | #define SCB_BUSY 0x10 |
395 | #define SCB_DONE 0x20 | 395 | #define SCB_DONE 0x20 |
diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index b2511acd39bd..218f71a8726e 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c | |||
@@ -137,7 +137,7 @@ | |||
137 | /* - Fix path/name for scsi_hosts.h include for 2.6 kernels */ | 137 | /* - Fix path/name for scsi_hosts.h include for 2.6 kernels */ |
138 | /* - Fix sort order of 7k */ | 138 | /* - Fix sort order of 7k */ |
139 | /* - Remove 3 unused "inline" functions */ | 139 | /* - Remove 3 unused "inline" functions */ |
140 | /* 7.12.xx - Use STATIC functions whereever possible */ | 140 | /* 7.12.xx - Use STATIC functions wherever possible */ |
141 | /* - Clean up deprecated MODULE_PARM calls */ | 141 | /* - Clean up deprecated MODULE_PARM calls */ |
142 | /* 7.12.05 - Remove Version Matching per IBM request */ | 142 | /* 7.12.05 - Remove Version Matching per IBM request */ |
143 | /*****************************************************************************/ | 143 | /*****************************************************************************/ |
@@ -1665,7 +1665,7 @@ ips_flash_copperhead(ips_ha_t * ha, ips_passthru_t * pt, ips_scb_t * scb) | |||
1665 | int datasize; | 1665 | int datasize; |
1666 | 1666 | ||
1667 | /* Trombone is the only copperhead that can do packet flash, but only | 1667 | /* Trombone is the only copperhead that can do packet flash, but only |
1668 | * for firmware. No one said it had to make sence. */ | 1668 | * for firmware. No one said it had to make sense. */ |
1669 | if (IPS_IS_TROMBONE(ha) && pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE) { | 1669 | if (IPS_IS_TROMBONE(ha) && pt->CoppCP.cmd.flashfw.type == IPS_FW_IMAGE) { |
1670 | if (ips_usrcmd(ha, pt, scb)) | 1670 | if (ips_usrcmd(ha, pt, scb)) |
1671 | return IPS_SUCCESS; | 1671 | return IPS_SUCCESS; |
diff --git a/drivers/scsi/ips.h b/drivers/scsi/ips.h index 4e49fbcfe8af..f2df0593332b 100644 --- a/drivers/scsi/ips.h +++ b/drivers/scsi/ips.h | |||
@@ -1193,7 +1193,7 @@ typedef struct { | |||
1193 | #define IPS_VER_SEBRING "7.12.02" | 1193 | #define IPS_VER_SEBRING "7.12.02" |
1194 | #define IPS_VER_KEYWEST "7.12.02" | 1194 | #define IPS_VER_KEYWEST "7.12.02" |
1195 | 1195 | ||
1196 | /* Compatability IDs for various adapters */ | 1196 | /* Compatibility IDs for various adapters */ |
1197 | #define IPS_COMPAT_UNKNOWN "" | 1197 | #define IPS_COMPAT_UNKNOWN "" |
1198 | #define IPS_COMPAT_CURRENT "KW710" | 1198 | #define IPS_COMPAT_CURRENT "KW710" |
1199 | #define IPS_COMPAT_SERVERAID1 "2.25.01" | 1199 | #define IPS_COMPAT_SERVERAID1 "2.25.01" |
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index a860452a8f71..3df985305f69 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
@@ -295,7 +295,7 @@ static int iscsi_sw_tcp_xmit(struct iscsi_conn *conn) | |||
295 | rc = iscsi_sw_tcp_xmit_segment(tcp_conn, segment); | 295 | rc = iscsi_sw_tcp_xmit_segment(tcp_conn, segment); |
296 | /* | 296 | /* |
297 | * We may not have been able to send data because the conn | 297 | * We may not have been able to send data because the conn |
298 | * is getting stopped. libiscsi will know so propogate err | 298 | * is getting stopped. libiscsi will know so propagate err |
299 | * for it to do the right thing. | 299 | * for it to do the right thing. |
300 | */ | 300 | */ |
301 | if (rc == -EAGAIN) | 301 | if (rc == -EAGAIN) |
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c index 28231badd9e6..77035a746f60 100644 --- a/drivers/scsi/libfc/fc_exch.c +++ b/drivers/scsi/libfc/fc_exch.c | |||
@@ -1042,7 +1042,7 @@ static void fc_exch_set_addr(struct fc_exch *ep, | |||
1042 | } | 1042 | } |
1043 | 1043 | ||
1044 | /** | 1044 | /** |
1045 | * fc_seq_els_rsp_send() - Send an ELS response using infomation from | 1045 | * fc_seq_els_rsp_send() - Send an ELS response using information from |
1046 | * the existing sequence/exchange. | 1046 | * the existing sequence/exchange. |
1047 | * @fp: The received frame | 1047 | * @fp: The received frame |
1048 | * @els_cmd: The ELS command to be sent | 1048 | * @els_cmd: The ELS command to be sent |
@@ -1153,7 +1153,7 @@ static void fc_seq_send_ack(struct fc_seq *sp, const struct fc_frame *rx_fp) | |||
1153 | * fc_exch_send_ba_rjt() - Send BLS Reject | 1153 | * fc_exch_send_ba_rjt() - Send BLS Reject |
1154 | * @rx_fp: The frame being rejected | 1154 | * @rx_fp: The frame being rejected |
1155 | * @reason: The reason the frame is being rejected | 1155 | * @reason: The reason the frame is being rejected |
1156 | * @explan: The explaination for the rejection | 1156 | * @explan: The explanation for the rejection |
1157 | * | 1157 | * |
1158 | * This is for rejecting BA_ABTS only. | 1158 | * This is for rejecting BA_ABTS only. |
1159 | */ | 1159 | */ |
diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c index b1b03af158bf..5b799a37ad09 100644 --- a/drivers/scsi/libfc/fc_fcp.c +++ b/drivers/scsi/libfc/fc_fcp.c | |||
@@ -870,7 +870,7 @@ static void fc_fcp_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp) | |||
870 | fsp->scsi_resid = ntohl(rp_ex->fr_resid); | 870 | fsp->scsi_resid = ntohl(rp_ex->fr_resid); |
871 | /* | 871 | /* |
872 | * The cmnd->underflow is the minimum number of | 872 | * The cmnd->underflow is the minimum number of |
873 | * bytes that must be transfered for this | 873 | * bytes that must be transferred for this |
874 | * command. Provided a sense condition is not | 874 | * command. Provided a sense condition is not |
875 | * present, make sure the actual amount | 875 | * present, make sure the actual amount |
876 | * transferred is at least the underflow value | 876 | * transferred is at least the underflow value |
@@ -1306,7 +1306,7 @@ static int fc_lun_reset(struct fc_lport *lport, struct fc_fcp_pkt *fsp, | |||
1306 | } | 1306 | } |
1307 | 1307 | ||
1308 | /** | 1308 | /** |
1309 | * fc_tm_done() - Task Managment response handler | 1309 | * fc_tm_done() - Task Management response handler |
1310 | * @seq: The sequence that the response is on | 1310 | * @seq: The sequence that the response is on |
1311 | * @fp: The response frame | 1311 | * @fp: The response frame |
1312 | * @arg: The FCP packet the response is for | 1312 | * @arg: The FCP packet the response is for |
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c index 8c08b210001d..906bbcad0e2d 100644 --- a/drivers/scsi/libfc/fc_lport.c +++ b/drivers/scsi/libfc/fc_lport.c | |||
@@ -52,7 +52,7 @@ | |||
52 | * while making the callback. To ensure that the rport is not free'd while | 52 | * while making the callback. To ensure that the rport is not free'd while |
53 | * processing the callback the rport callbacks are serialized through a | 53 | * processing the callback the rport callbacks are serialized through a |
54 | * single-threaded workqueue. An rport would never be free'd while in a | 54 | * single-threaded workqueue. An rport would never be free'd while in a |
55 | * callback handler becuase no other rport work in this queue can be executed | 55 | * callback handler because no other rport work in this queue can be executed |
56 | * at the same time. | 56 | * at the same time. |
57 | * | 57 | * |
58 | * When discovery succeeds or fails a callback is made to the lport as | 58 | * When discovery succeeds or fails a callback is made to the lport as |
@@ -163,7 +163,7 @@ static int fc_frame_drop(struct fc_lport *lport, struct fc_frame *fp) | |||
163 | * fc_lport_rport_callback() - Event handler for rport events | 163 | * fc_lport_rport_callback() - Event handler for rport events |
164 | * @lport: The lport which is receiving the event | 164 | * @lport: The lport which is receiving the event |
165 | * @rdata: private remote port data | 165 | * @rdata: private remote port data |
166 | * @event: The event that occured | 166 | * @event: The event that occurred |
167 | * | 167 | * |
168 | * Locking Note: The rport lock should not be held when calling | 168 | * Locking Note: The rport lock should not be held when calling |
169 | * this function. | 169 | * this function. |
@@ -379,7 +379,7 @@ static void fc_lport_add_fc4_type(struct fc_lport *lport, enum fc_fh_type type) | |||
379 | 379 | ||
380 | /** | 380 | /** |
381 | * fc_lport_recv_rlir_req() - Handle received Registered Link Incident Report. | 381 | * fc_lport_recv_rlir_req() - Handle received Registered Link Incident Report. |
382 | * @lport: Fibre Channel local port recieving the RLIR | 382 | * @lport: Fibre Channel local port receiving the RLIR |
383 | * @fp: The RLIR request frame | 383 | * @fp: The RLIR request frame |
384 | * | 384 | * |
385 | * Locking Note: The lport lock is expected to be held before calling | 385 | * Locking Note: The lport lock is expected to be held before calling |
@@ -396,7 +396,7 @@ static void fc_lport_recv_rlir_req(struct fc_lport *lport, struct fc_frame *fp) | |||
396 | 396 | ||
397 | /** | 397 | /** |
398 | * fc_lport_recv_echo_req() - Handle received ECHO request | 398 | * fc_lport_recv_echo_req() - Handle received ECHO request |
399 | * @lport: The local port recieving the ECHO | 399 | * @lport: The local port receiving the ECHO |
400 | * @fp: ECHO request frame | 400 | * @fp: ECHO request frame |
401 | * | 401 | * |
402 | * Locking Note: The lport lock is expected to be held before calling | 402 | * Locking Note: The lport lock is expected to be held before calling |
@@ -432,7 +432,7 @@ static void fc_lport_recv_echo_req(struct fc_lport *lport, | |||
432 | 432 | ||
433 | /** | 433 | /** |
434 | * fc_lport_recv_rnid_req() - Handle received Request Node ID data request | 434 | * fc_lport_recv_rnid_req() - Handle received Request Node ID data request |
435 | * @lport: The local port recieving the RNID | 435 | * @lport: The local port receiving the RNID |
436 | * @fp: The RNID request frame | 436 | * @fp: The RNID request frame |
437 | * | 437 | * |
438 | * Locking Note: The lport lock is expected to be held before calling | 438 | * Locking Note: The lport lock is expected to be held before calling |
@@ -491,7 +491,7 @@ static void fc_lport_recv_rnid_req(struct fc_lport *lport, | |||
491 | 491 | ||
492 | /** | 492 | /** |
493 | * fc_lport_recv_logo_req() - Handle received fabric LOGO request | 493 | * fc_lport_recv_logo_req() - Handle received fabric LOGO request |
494 | * @lport: The local port recieving the LOGO | 494 | * @lport: The local port receiving the LOGO |
495 | * @fp: The LOGO request frame | 495 | * @fp: The LOGO request frame |
496 | * | 496 | * |
497 | * Locking Note: The lport lock is exected to be held before calling | 497 | * Locking Note: The lport lock is exected to be held before calling |
@@ -771,7 +771,7 @@ EXPORT_SYMBOL(fc_lport_set_local_id); | |||
771 | 771 | ||
772 | /** | 772 | /** |
773 | * fc_lport_recv_flogi_req() - Receive a FLOGI request | 773 | * fc_lport_recv_flogi_req() - Receive a FLOGI request |
774 | * @lport: The local port that recieved the request | 774 | * @lport: The local port that received the request |
775 | * @rx_fp: The FLOGI frame | 775 | * @rx_fp: The FLOGI frame |
776 | * | 776 | * |
777 | * A received FLOGI request indicates a point-to-point connection. | 777 | * A received FLOGI request indicates a point-to-point connection. |
@@ -858,7 +858,7 @@ out: | |||
858 | * if an rport should handle the request. | 858 | * if an rport should handle the request. |
859 | * | 859 | * |
860 | * Locking Note: This function should not be called with the lport | 860 | * Locking Note: This function should not be called with the lport |
861 | * lock held becuase it will grab the lock. | 861 | * lock held because it will grab the lock. |
862 | */ | 862 | */ |
863 | static void fc_lport_recv_els_req(struct fc_lport *lport, | 863 | static void fc_lport_recv_els_req(struct fc_lport *lport, |
864 | struct fc_frame *fp) | 864 | struct fc_frame *fp) |
@@ -925,7 +925,7 @@ struct fc4_prov fc_lport_els_prov = { | |||
925 | * @fp: The frame the request is in | 925 | * @fp: The frame the request is in |
926 | * | 926 | * |
927 | * Locking Note: This function should not be called with the lport | 927 | * Locking Note: This function should not be called with the lport |
928 | * lock held becuase it may grab the lock. | 928 | * lock held because it may grab the lock. |
929 | */ | 929 | */ |
930 | static void fc_lport_recv_req(struct fc_lport *lport, | 930 | static void fc_lport_recv_req(struct fc_lport *lport, |
931 | struct fc_frame *fp) | 931 | struct fc_frame *fp) |
diff --git a/drivers/scsi/libiscsi_tcp.c b/drivers/scsi/libiscsi_tcp.c index 8eeb39ffa37f..e98ae33f1295 100644 --- a/drivers/scsi/libiscsi_tcp.c +++ b/drivers/scsi/libiscsi_tcp.c | |||
@@ -132,14 +132,25 @@ static void iscsi_tcp_segment_map(struct iscsi_segment *segment, int recv) | |||
132 | if (page_count(sg_page(sg)) >= 1 && !recv) | 132 | if (page_count(sg_page(sg)) >= 1 && !recv) |
133 | return; | 133 | return; |
134 | 134 | ||
135 | segment->sg_mapped = kmap_atomic(sg_page(sg), KM_SOFTIRQ0); | 135 | if (recv) { |
136 | segment->atomic_mapped = true; | ||
137 | segment->sg_mapped = kmap_atomic(sg_page(sg), KM_SOFTIRQ0); | ||
138 | } else { | ||
139 | segment->atomic_mapped = false; | ||
140 | /* the xmit path can sleep with the page mapped so use kmap */ | ||
141 | segment->sg_mapped = kmap(sg_page(sg)); | ||
142 | } | ||
143 | |||
136 | segment->data = segment->sg_mapped + sg->offset + segment->sg_offset; | 144 | segment->data = segment->sg_mapped + sg->offset + segment->sg_offset; |
137 | } | 145 | } |
138 | 146 | ||
139 | void iscsi_tcp_segment_unmap(struct iscsi_segment *segment) | 147 | void iscsi_tcp_segment_unmap(struct iscsi_segment *segment) |
140 | { | 148 | { |
141 | if (segment->sg_mapped) { | 149 | if (segment->sg_mapped) { |
142 | kunmap_atomic(segment->sg_mapped, KM_SOFTIRQ0); | 150 | if (segment->atomic_mapped) |
151 | kunmap_atomic(segment->sg_mapped, KM_SOFTIRQ0); | ||
152 | else | ||
153 | kunmap(sg_page(segment->sg)); | ||
143 | segment->sg_mapped = NULL; | 154 | segment->sg_mapped = NULL; |
144 | segment->data = NULL; | 155 | segment->data = NULL; |
145 | } | 156 | } |
diff --git a/drivers/scsi/libsas/Makefile b/drivers/scsi/libsas/Makefile index 566a10024598..2e70140f70c3 100644 --- a/drivers/scsi/libsas/Makefile +++ b/drivers/scsi/libsas/Makefile | |||
@@ -32,4 +32,4 @@ libsas-y += sas_init.o \ | |||
32 | sas_scsi_host.o \ | 32 | sas_scsi_host.o \ |
33 | sas_task.o | 33 | sas_task.o |
34 | libsas-$(CONFIG_SCSI_SAS_ATA) += sas_ata.o | 34 | libsas-$(CONFIG_SCSI_SAS_ATA) += sas_ata.o |
35 | libsas-$(CONFIG_SCSI_SAS_HOST_SMP) += sas_host_smp.o \ No newline at end of file | 35 | libsas-$(CONFIG_SCSI_SAS_HOST_SMP) += sas_host_smp.o |
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c index f3f693b772ac..874e29d9533f 100644 --- a/drivers/scsi/libsas/sas_expander.c +++ b/drivers/scsi/libsas/sas_expander.c | |||
@@ -240,7 +240,7 @@ static int sas_ex_phy_discover_helper(struct domain_device *dev, u8 *disc_req, | |||
240 | disc_resp, DISCOVER_RESP_SIZE); | 240 | disc_resp, DISCOVER_RESP_SIZE); |
241 | if (res) | 241 | if (res) |
242 | return res; | 242 | return res; |
243 | /* This is detecting a failure to transmit inital | 243 | /* This is detecting a failure to transmit initial |
244 | * dev to host FIS as described in section G.5 of | 244 | * dev to host FIS as described in section G.5 of |
245 | * sas-2 r 04b */ | 245 | * sas-2 r 04b */ |
246 | dr = &((struct smp_resp *)disc_resp)->disc; | 246 | dr = &((struct smp_resp *)disc_resp)->disc; |
diff --git a/drivers/scsi/lpfc/Makefile b/drivers/scsi/lpfc/Makefile index ad05d6edb8f6..88928f00aa2d 100644 --- a/drivers/scsi/lpfc/Makefile +++ b/drivers/scsi/lpfc/Makefile | |||
@@ -1,7 +1,7 @@ | |||
1 | #/******************************************************************* | 1 | #/******************************************************************* |
2 | # * This file is part of the Emulex Linux Device Driver for * | 2 | # * This file is part of the Emulex Linux Device Driver for * |
3 | # * Fibre Channel Host Bus Adapters. * | 3 | # * Fibre Channel Host Bus Adapters. * |
4 | # * Copyright (C) 2004-2006 Emulex. All rights reserved. * | 4 | # * Copyright (C) 2004-2011 Emulex. All rights reserved. * |
5 | # * EMULEX and SLI are trademarks of Emulex. * | 5 | # * EMULEX and SLI are trademarks of Emulex. * |
6 | # * www.emulex.com * | 6 | # * www.emulex.com * |
7 | # * * | 7 | # * * |
@@ -19,10 +19,8 @@ | |||
19 | # *******************************************************************/ | 19 | # *******************************************************************/ |
20 | ###################################################################### | 20 | ###################################################################### |
21 | 21 | ||
22 | ifneq ($(GCOV),) | 22 | ccflags-$(GCOV) := -fprofile-arcs -ftest-coverage |
23 | EXTRA_CFLAGS += -fprofile-arcs -ftest-coverage | 23 | ccflags-$(GCOV) += -O0 |
24 | EXTRA_CFLAGS += -O0 | ||
25 | endif | ||
26 | 24 | ||
27 | obj-$(CONFIG_SCSI_LPFC) := lpfc.o | 25 | obj-$(CONFIG_SCSI_LPFC) := lpfc.o |
28 | 26 | ||
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index b64c6da870d3..60e98a62f308 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -539,6 +539,8 @@ struct lpfc_hba { | |||
539 | (struct lpfc_hba *, uint32_t); | 539 | (struct lpfc_hba *, uint32_t); |
540 | int (*lpfc_hba_down_link) | 540 | int (*lpfc_hba_down_link) |
541 | (struct lpfc_hba *, uint32_t); | 541 | (struct lpfc_hba *, uint32_t); |
542 | int (*lpfc_selective_reset) | ||
543 | (struct lpfc_hba *); | ||
542 | 544 | ||
543 | /* SLI4 specific HBA data structure */ | 545 | /* SLI4 specific HBA data structure */ |
544 | struct lpfc_sli4_hba sli4_hba; | 546 | struct lpfc_sli4_hba sli4_hba; |
@@ -895,7 +897,18 @@ lpfc_worker_wake_up(struct lpfc_hba *phba) | |||
895 | return; | 897 | return; |
896 | } | 898 | } |
897 | 899 | ||
898 | static inline void | 900 | static inline int |
901 | lpfc_readl(void __iomem *addr, uint32_t *data) | ||
902 | { | ||
903 | uint32_t temp; | ||
904 | temp = readl(addr); | ||
905 | if (temp == 0xffffffff) | ||
906 | return -EIO; | ||
907 | *data = temp; | ||
908 | return 0; | ||
909 | } | ||
910 | |||
911 | static inline int | ||
899 | lpfc_sli_read_hs(struct lpfc_hba *phba) | 912 | lpfc_sli_read_hs(struct lpfc_hba *phba) |
900 | { | 913 | { |
901 | /* | 914 | /* |
@@ -904,15 +917,17 @@ lpfc_sli_read_hs(struct lpfc_hba *phba) | |||
904 | */ | 917 | */ |
905 | phba->sli.slistat.err_attn_event++; | 918 | phba->sli.slistat.err_attn_event++; |
906 | 919 | ||
907 | /* Save status info */ | 920 | /* Save status info and check for unplug error */ |
908 | phba->work_hs = readl(phba->HSregaddr); | 921 | if (lpfc_readl(phba->HSregaddr, &phba->work_hs) || |
909 | phba->work_status[0] = readl(phba->MBslimaddr + 0xa8); | 922 | lpfc_readl(phba->MBslimaddr + 0xa8, &phba->work_status[0]) || |
910 | phba->work_status[1] = readl(phba->MBslimaddr + 0xac); | 923 | lpfc_readl(phba->MBslimaddr + 0xac, &phba->work_status[1])) { |
924 | return -EIO; | ||
925 | } | ||
911 | 926 | ||
912 | /* Clear chip Host Attention error bit */ | 927 | /* Clear chip Host Attention error bit */ |
913 | writel(HA_ERATT, phba->HAregaddr); | 928 | writel(HA_ERATT, phba->HAregaddr); |
914 | readl(phba->HAregaddr); /* flush */ | 929 | readl(phba->HAregaddr); /* flush */ |
915 | phba->pport->stopped = 1; | 930 | phba->pport->stopped = 1; |
916 | 931 | ||
917 | return; | 932 | return 0; |
918 | } | 933 | } |
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index e7c020df12fa..17d789325f40 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
@@ -685,7 +685,7 @@ lpfc_do_offline(struct lpfc_hba *phba, uint32_t type) | |||
685 | * -EIO reset not configured or error posting the event | 685 | * -EIO reset not configured or error posting the event |
686 | * zero for success | 686 | * zero for success |
687 | **/ | 687 | **/ |
688 | static int | 688 | int |
689 | lpfc_selective_reset(struct lpfc_hba *phba) | 689 | lpfc_selective_reset(struct lpfc_hba *phba) |
690 | { | 690 | { |
691 | struct completion online_compl; | 691 | struct completion online_compl; |
@@ -746,7 +746,7 @@ lpfc_issue_reset(struct device *dev, struct device_attribute *attr, | |||
746 | int status = -EINVAL; | 746 | int status = -EINVAL; |
747 | 747 | ||
748 | if (strncmp(buf, "selective", sizeof("selective") - 1) == 0) | 748 | if (strncmp(buf, "selective", sizeof("selective") - 1) == 0) |
749 | status = lpfc_selective_reset(phba); | 749 | status = phba->lpfc_selective_reset(phba); |
750 | 750 | ||
751 | if (status == 0) | 751 | if (status == 0) |
752 | return strlen(buf); | 752 | return strlen(buf); |
@@ -1224,7 +1224,10 @@ lpfc_poll_store(struct device *dev, struct device_attribute *attr, | |||
1224 | if (val & ENABLE_FCP_RING_POLLING) { | 1224 | if (val & ENABLE_FCP_RING_POLLING) { |
1225 | if ((val & DISABLE_FCP_RING_INT) && | 1225 | if ((val & DISABLE_FCP_RING_INT) && |
1226 | !(old_val & DISABLE_FCP_RING_INT)) { | 1226 | !(old_val & DISABLE_FCP_RING_INT)) { |
1227 | creg_val = readl(phba->HCregaddr); | 1227 | if (lpfc_readl(phba->HCregaddr, &creg_val)) { |
1228 | spin_unlock_irq(&phba->hbalock); | ||
1229 | return -EINVAL; | ||
1230 | } | ||
1228 | creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING); | 1231 | creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING); |
1229 | writel(creg_val, phba->HCregaddr); | 1232 | writel(creg_val, phba->HCregaddr); |
1230 | readl(phba->HCregaddr); /* flush */ | 1233 | readl(phba->HCregaddr); /* flush */ |
@@ -1242,7 +1245,10 @@ lpfc_poll_store(struct device *dev, struct device_attribute *attr, | |||
1242 | spin_unlock_irq(&phba->hbalock); | 1245 | spin_unlock_irq(&phba->hbalock); |
1243 | del_timer(&phba->fcp_poll_timer); | 1246 | del_timer(&phba->fcp_poll_timer); |
1244 | spin_lock_irq(&phba->hbalock); | 1247 | spin_lock_irq(&phba->hbalock); |
1245 | creg_val = readl(phba->HCregaddr); | 1248 | if (lpfc_readl(phba->HCregaddr, &creg_val)) { |
1249 | spin_unlock_irq(&phba->hbalock); | ||
1250 | return -EINVAL; | ||
1251 | } | ||
1246 | creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); | 1252 | creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); |
1247 | writel(creg_val, phba->HCregaddr); | 1253 | writel(creg_val, phba->HCregaddr); |
1248 | readl(phba->HCregaddr); /* flush */ | 1254 | readl(phba->HCregaddr); /* flush */ |
@@ -4509,7 +4515,7 @@ static FC_RPORT_ATTR(field, S_IRUGO, lpfc_show_rport_##field, NULL) | |||
4509 | * Description: | 4515 | * Description: |
4510 | * This function is called by the transport after the @fc_vport's symbolic name | 4516 | * This function is called by the transport after the @fc_vport's symbolic name |
4511 | * has been changed. This function re-registers the symbolic name with the | 4517 | * has been changed. This function re-registers the symbolic name with the |
4512 | * switch to propogate the change into the fabric if the vport is active. | 4518 | * switch to propagate the change into the fabric if the vport is active. |
4513 | **/ | 4519 | **/ |
4514 | static void | 4520 | static void |
4515 | lpfc_set_vport_symbolic_name(struct fc_vport *fc_vport) | 4521 | lpfc_set_vport_symbolic_name(struct fc_vport *fc_vport) |
diff --git a/drivers/scsi/lpfc/lpfc_bsg.c b/drivers/scsi/lpfc/lpfc_bsg.c index 04fef038b1ff..3811ea9ce8e4 100644 --- a/drivers/scsi/lpfc/lpfc_bsg.c +++ b/drivers/scsi/lpfc/lpfc_bsg.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2009-2010 Emulex. All rights reserved. * | 4 | * Copyright (C) 2009-2011 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
@@ -348,7 +348,10 @@ lpfc_bsg_send_mgmt_cmd(struct fc_bsg_job *job) | |||
348 | dd_data->context_un.iocb.bmp = bmp; | 348 | dd_data->context_un.iocb.bmp = bmp; |
349 | 349 | ||
350 | if (phba->cfg_poll & DISABLE_FCP_RING_INT) { | 350 | if (phba->cfg_poll & DISABLE_FCP_RING_INT) { |
351 | creg_val = readl(phba->HCregaddr); | 351 | if (lpfc_readl(phba->HCregaddr, &creg_val)) { |
352 | rc = -EIO ; | ||
353 | goto free_cmdiocbq; | ||
354 | } | ||
352 | creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); | 355 | creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); |
353 | writel(creg_val, phba->HCregaddr); | 356 | writel(creg_val, phba->HCregaddr); |
354 | readl(phba->HCregaddr); /* flush */ | 357 | readl(phba->HCregaddr); /* flush */ |
@@ -599,7 +602,10 @@ lpfc_bsg_rport_els(struct fc_bsg_job *job) | |||
599 | dd_data->context_un.iocb.ndlp = ndlp; | 602 | dd_data->context_un.iocb.ndlp = ndlp; |
600 | 603 | ||
601 | if (phba->cfg_poll & DISABLE_FCP_RING_INT) { | 604 | if (phba->cfg_poll & DISABLE_FCP_RING_INT) { |
602 | creg_val = readl(phba->HCregaddr); | 605 | if (lpfc_readl(phba->HCregaddr, &creg_val)) { |
606 | rc = -EIO; | ||
607 | goto linkdown_err; | ||
608 | } | ||
603 | creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); | 609 | creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); |
604 | writel(creg_val, phba->HCregaddr); | 610 | writel(creg_val, phba->HCregaddr); |
605 | readl(phba->HCregaddr); /* flush */ | 611 | readl(phba->HCregaddr); /* flush */ |
@@ -613,6 +619,7 @@ lpfc_bsg_rport_els(struct fc_bsg_job *job) | |||
613 | else | 619 | else |
614 | rc = -EIO; | 620 | rc = -EIO; |
615 | 621 | ||
622 | linkdown_err: | ||
616 | pci_unmap_sg(phba->pcidev, job->request_payload.sg_list, | 623 | pci_unmap_sg(phba->pcidev, job->request_payload.sg_list, |
617 | job->request_payload.sg_cnt, DMA_TO_DEVICE); | 624 | job->request_payload.sg_cnt, DMA_TO_DEVICE); |
618 | pci_unmap_sg(phba->pcidev, job->reply_payload.sg_list, | 625 | pci_unmap_sg(phba->pcidev, job->reply_payload.sg_list, |
@@ -1357,7 +1364,10 @@ lpfc_issue_ct_rsp(struct lpfc_hba *phba, struct fc_bsg_job *job, uint32_t tag, | |||
1357 | dd_data->context_un.iocb.ndlp = ndlp; | 1364 | dd_data->context_un.iocb.ndlp = ndlp; |
1358 | 1365 | ||
1359 | if (phba->cfg_poll & DISABLE_FCP_RING_INT) { | 1366 | if (phba->cfg_poll & DISABLE_FCP_RING_INT) { |
1360 | creg_val = readl(phba->HCregaddr); | 1367 | if (lpfc_readl(phba->HCregaddr, &creg_val)) { |
1368 | rc = -IOCB_ERROR; | ||
1369 | goto issue_ct_rsp_exit; | ||
1370 | } | ||
1361 | creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); | 1371 | creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); |
1362 | writel(creg_val, phba->HCregaddr); | 1372 | writel(creg_val, phba->HCregaddr); |
1363 | readl(phba->HCregaddr); /* flush */ | 1373 | readl(phba->HCregaddr); /* flush */ |
@@ -1929,7 +1939,7 @@ out: | |||
1929 | * @rxxri: Receive exchange id | 1939 | * @rxxri: Receive exchange id |
1930 | * @len: Number of data bytes | 1940 | * @len: Number of data bytes |
1931 | * | 1941 | * |
1932 | * This function allocates and posts a data buffer of sufficient size to recieve | 1942 | * This function allocates and posts a data buffer of sufficient size to receive |
1933 | * an unsolicted CT command. | 1943 | * an unsolicted CT command. |
1934 | **/ | 1944 | **/ |
1935 | static int lpfcdiag_loop_post_rxbufs(struct lpfc_hba *phba, uint16_t rxxri, | 1945 | static int lpfcdiag_loop_post_rxbufs(struct lpfc_hba *phba, uint16_t rxxri, |
@@ -2479,16 +2489,18 @@ lpfc_bsg_wake_mbox_wait(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmboxq) | |||
2479 | 2489 | ||
2480 | from = (uint8_t *)dd_data->context_un.mbox.mb; | 2490 | from = (uint8_t *)dd_data->context_un.mbox.mb; |
2481 | job = dd_data->context_un.mbox.set_job; | 2491 | job = dd_data->context_un.mbox.set_job; |
2482 | size = job->reply_payload.payload_len; | 2492 | if (job) { |
2483 | job->reply->reply_payload_rcv_len = | 2493 | size = job->reply_payload.payload_len; |
2484 | sg_copy_from_buffer(job->reply_payload.sg_list, | 2494 | job->reply->reply_payload_rcv_len = |
2485 | job->reply_payload.sg_cnt, | 2495 | sg_copy_from_buffer(job->reply_payload.sg_list, |
2486 | from, size); | 2496 | job->reply_payload.sg_cnt, |
2487 | job->reply->result = 0; | 2497 | from, size); |
2498 | job->reply->result = 0; | ||
2488 | 2499 | ||
2500 | job->dd_data = NULL; | ||
2501 | job->job_done(job); | ||
2502 | } | ||
2489 | dd_data->context_un.mbox.set_job = NULL; | 2503 | dd_data->context_un.mbox.set_job = NULL; |
2490 | job->dd_data = NULL; | ||
2491 | job->job_done(job); | ||
2492 | /* need to hold the lock until we call job done to hold off | 2504 | /* need to hold the lock until we call job done to hold off |
2493 | * the timeout handler returning to the midlayer while | 2505 | * the timeout handler returning to the midlayer while |
2494 | * we are stillprocessing the job | 2506 | * we are stillprocessing the job |
diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h index 3d40023f4804..f0b332f4eedb 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2010 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2011 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
@@ -254,8 +254,8 @@ uint16_t lpfc_sli_next_iotag(struct lpfc_hba *, struct lpfc_iocbq *); | |||
254 | void lpfc_sli_cancel_iocbs(struct lpfc_hba *, struct list_head *, uint32_t, | 254 | void lpfc_sli_cancel_iocbs(struct lpfc_hba *, struct list_head *, uint32_t, |
255 | uint32_t); | 255 | uint32_t); |
256 | void lpfc_sli_wake_mbox_wait(struct lpfc_hba *, LPFC_MBOXQ_t *); | 256 | void lpfc_sli_wake_mbox_wait(struct lpfc_hba *, LPFC_MBOXQ_t *); |
257 | 257 | int lpfc_selective_reset(struct lpfc_hba *); | |
258 | void lpfc_reset_barrier(struct lpfc_hba * phba); | 258 | void lpfc_reset_barrier(struct lpfc_hba *); |
259 | int lpfc_sli_brdready(struct lpfc_hba *, uint32_t); | 259 | int lpfc_sli_brdready(struct lpfc_hba *, uint32_t); |
260 | int lpfc_sli_brdkill(struct lpfc_hba *); | 260 | int lpfc_sli_brdkill(struct lpfc_hba *); |
261 | int lpfc_sli_brdreset(struct lpfc_hba *); | 261 | int lpfc_sli_brdreset(struct lpfc_hba *); |
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index a753581509d6..3d967741c708 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
@@ -908,7 +908,7 @@ lpfc_debugfs_dumpData_open(struct inode *inode, struct file *file) | |||
908 | if (!debug) | 908 | if (!debug) |
909 | goto out; | 909 | goto out; |
910 | 910 | ||
911 | /* Round to page boundry */ | 911 | /* Round to page boundary */ |
912 | printk(KERN_ERR "9059 BLKGRD: %s: _dump_buf_data=0x%p\n", | 912 | printk(KERN_ERR "9059 BLKGRD: %s: _dump_buf_data=0x%p\n", |
913 | __func__, _dump_buf_data); | 913 | __func__, _dump_buf_data); |
914 | debug->buffer = _dump_buf_data; | 914 | debug->buffer = _dump_buf_data; |
@@ -938,7 +938,7 @@ lpfc_debugfs_dumpDif_open(struct inode *inode, struct file *file) | |||
938 | if (!debug) | 938 | if (!debug) |
939 | goto out; | 939 | goto out; |
940 | 940 | ||
941 | /* Round to page boundry */ | 941 | /* Round to page boundary */ |
942 | printk(KERN_ERR "9060 BLKGRD: %s: _dump_buf_dif=0x%p file=%s\n", | 942 | printk(KERN_ERR "9060 BLKGRD: %s: _dump_buf_dif=0x%p file=%s\n", |
943 | __func__, _dump_buf_dif, file->f_dentry->d_name.name); | 943 | __func__, _dump_buf_dif, file->f_dentry->d_name.name); |
944 | debug->buffer = _dump_buf_dif; | 944 | debug->buffer = _dump_buf_dif; |
@@ -2158,7 +2158,7 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport) | |||
2158 | debugfs_create_dir(name, phba->hba_debugfs_root); | 2158 | debugfs_create_dir(name, phba->hba_debugfs_root); |
2159 | if (!vport->vport_debugfs_root) { | 2159 | if (!vport->vport_debugfs_root) { |
2160 | lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, | 2160 | lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, |
2161 | "0417 Cant create debugfs\n"); | 2161 | "0417 Can't create debugfs\n"); |
2162 | goto debug_failed; | 2162 | goto debug_failed; |
2163 | } | 2163 | } |
2164 | atomic_inc(&phba->debugfs_vport_count); | 2164 | atomic_inc(&phba->debugfs_vport_count); |
@@ -2211,7 +2211,7 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport) | |||
2211 | vport, &lpfc_debugfs_op_nodelist); | 2211 | vport, &lpfc_debugfs_op_nodelist); |
2212 | if (!vport->debug_nodelist) { | 2212 | if (!vport->debug_nodelist) { |
2213 | lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, | 2213 | lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, |
2214 | "0409 Cant create debugfs nodelist\n"); | 2214 | "0409 Can't create debugfs nodelist\n"); |
2215 | goto debug_failed; | 2215 | goto debug_failed; |
2216 | } | 2216 | } |
2217 | 2217 | ||
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 8e28edf9801e..d34b69f9cdb1 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c | |||
@@ -89,7 +89,8 @@ lpfc_els_chk_latt(struct lpfc_vport *vport) | |||
89 | return 0; | 89 | return 0; |
90 | 90 | ||
91 | /* Read the HBA Host Attention Register */ | 91 | /* Read the HBA Host Attention Register */ |
92 | ha_copy = readl(phba->HAregaddr); | 92 | if (lpfc_readl(phba->HAregaddr, &ha_copy)) |
93 | return 1; | ||
93 | 94 | ||
94 | if (!(ha_copy & HA_LATT)) | 95 | if (!(ha_copy & HA_LATT)) |
95 | return 0; | 96 | return 0; |
@@ -101,7 +102,7 @@ lpfc_els_chk_latt(struct lpfc_vport *vport) | |||
101 | phba->pport->port_state); | 102 | phba->pport->port_state); |
102 | 103 | ||
103 | /* CLEAR_LA should re-enable link attention events and | 104 | /* CLEAR_LA should re-enable link attention events and |
104 | * we should then imediately take a LATT event. The | 105 | * we should then immediately take a LATT event. The |
105 | * LATT processing should call lpfc_linkdown() which | 106 | * LATT processing should call lpfc_linkdown() which |
106 | * will cleanup any left over in-progress discovery | 107 | * will cleanup any left over in-progress discovery |
107 | * events. | 108 | * events. |
@@ -1598,7 +1599,7 @@ out: | |||
1598 | * This routine is the completion callback function for issuing the Port | 1599 | * This routine is the completion callback function for issuing the Port |
1599 | * Login (PLOGI) command. For PLOGI completion, there must be an active | 1600 | * Login (PLOGI) command. For PLOGI completion, there must be an active |
1600 | * ndlp on the vport node list that matches the remote node ID from the | 1601 | * ndlp on the vport node list that matches the remote node ID from the |
1601 | * PLOGI reponse IOCB. If such ndlp does not exist, the PLOGI is simply | 1602 | * PLOGI response IOCB. If such ndlp does not exist, the PLOGI is simply |
1602 | * ignored and command IOCB released. The PLOGI response IOCB status is | 1603 | * ignored and command IOCB released. The PLOGI response IOCB status is |
1603 | * checked for error conditons. If there is error status reported, PLOGI | 1604 | * checked for error conditons. If there is error status reported, PLOGI |
1604 | * retry shall be attempted by invoking the lpfc_els_retry() routine. | 1605 | * retry shall be attempted by invoking the lpfc_els_retry() routine. |
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 154c715fb3af..301498301a8f 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -739,7 +739,7 @@ lpfc_do_work(void *p) | |||
739 | 739 | ||
740 | /* | 740 | /* |
741 | * This is only called to handle FC worker events. Since this a rare | 741 | * This is only called to handle FC worker events. Since this a rare |
742 | * occurance, we allocate a struct lpfc_work_evt structure here instead of | 742 | * occurrence, we allocate a struct lpfc_work_evt structure here instead of |
743 | * embedding it in the IOCB. | 743 | * embedding it in the IOCB. |
744 | */ | 744 | */ |
745 | int | 745 | int |
@@ -1348,7 +1348,7 @@ lpfc_register_fcf(struct lpfc_hba *phba) | |||
1348 | int rc; | 1348 | int rc; |
1349 | 1349 | ||
1350 | spin_lock_irq(&phba->hbalock); | 1350 | spin_lock_irq(&phba->hbalock); |
1351 | /* If the FCF is not availabe do nothing. */ | 1351 | /* If the FCF is not available do nothing. */ |
1352 | if (!(phba->fcf.fcf_flag & FCF_AVAILABLE)) { | 1352 | if (!(phba->fcf.fcf_flag & FCF_AVAILABLE)) { |
1353 | phba->hba_flag &= ~(FCF_TS_INPROG | FCF_RR_INPROG); | 1353 | phba->hba_flag &= ~(FCF_TS_INPROG | FCF_RR_INPROG); |
1354 | spin_unlock_irq(&phba->hbalock); | 1354 | spin_unlock_irq(&phba->hbalock); |
@@ -1538,7 +1538,7 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba, | |||
1538 | 1538 | ||
1539 | /* | 1539 | /* |
1540 | * If user did not specify any addressing mode, or if the | 1540 | * If user did not specify any addressing mode, or if the |
1541 | * prefered addressing mode specified by user is not supported | 1541 | * preferred addressing mode specified by user is not supported |
1542 | * by FCF, allow fabric to pick the addressing mode. | 1542 | * by FCF, allow fabric to pick the addressing mode. |
1543 | */ | 1543 | */ |
1544 | *addr_mode = bf_get(lpfc_fcf_record_mac_addr_prov, | 1544 | *addr_mode = bf_get(lpfc_fcf_record_mac_addr_prov, |
@@ -1553,7 +1553,7 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba, | |||
1553 | FCFCNCT_AM_SPMA) ? | 1553 | FCFCNCT_AM_SPMA) ? |
1554 | LPFC_FCF_SPMA : LPFC_FCF_FPMA; | 1554 | LPFC_FCF_SPMA : LPFC_FCF_FPMA; |
1555 | /* | 1555 | /* |
1556 | * If the user specified a prefered address mode, use the | 1556 | * If the user specified a preferred address mode, use the |
1557 | * addr mode only if FCF support the addr_mode. | 1557 | * addr mode only if FCF support the addr_mode. |
1558 | */ | 1558 | */ |
1559 | else if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && | 1559 | else if ((conn_entry->conn_rec.flags & FCFCNCT_AM_VALID) && |
@@ -3117,7 +3117,7 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
3117 | * back at reg login state so this | 3117 | * back at reg login state so this |
3118 | * mbox needs to be ignored becase | 3118 | * mbox needs to be ignored becase |
3119 | * there is another reg login in | 3119 | * there is another reg login in |
3120 | * proccess. | 3120 | * process. |
3121 | */ | 3121 | */ |
3122 | spin_lock_irq(shost->host_lock); | 3122 | spin_lock_irq(shost->host_lock); |
3123 | ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; | 3123 | ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; |
@@ -4477,7 +4477,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did) | |||
4477 | if ((vport->fc_flag & FC_RSCN_MODE) && | 4477 | if ((vport->fc_flag & FC_RSCN_MODE) && |
4478 | !(vport->fc_flag & FC_NDISC_ACTIVE)) { | 4478 | !(vport->fc_flag & FC_NDISC_ACTIVE)) { |
4479 | if (lpfc_rscn_payload_check(vport, did)) { | 4479 | if (lpfc_rscn_payload_check(vport, did)) { |
4480 | /* If we've already recieved a PLOGI from this NPort | 4480 | /* If we've already received a PLOGI from this NPort |
4481 | * we don't need to try to discover it again. | 4481 | * we don't need to try to discover it again. |
4482 | */ | 4482 | */ |
4483 | if (ndlp->nlp_flag & NLP_RCV_PLOGI) | 4483 | if (ndlp->nlp_flag & NLP_RCV_PLOGI) |
@@ -4493,7 +4493,7 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did) | |||
4493 | } else | 4493 | } else |
4494 | ndlp = NULL; | 4494 | ndlp = NULL; |
4495 | } else { | 4495 | } else { |
4496 | /* If we've already recieved a PLOGI from this NPort, | 4496 | /* If we've already received a PLOGI from this NPort, |
4497 | * or we are already in the process of discovery on it, | 4497 | * or we are already in the process of discovery on it, |
4498 | * we don't need to try to discover it again. | 4498 | * we don't need to try to discover it again. |
4499 | */ | 4499 | */ |
@@ -5756,7 +5756,7 @@ lpfc_read_fcoe_param(struct lpfc_hba *phba, | |||
5756 | * @size: Size of the data buffer. | 5756 | * @size: Size of the data buffer. |
5757 | * @rec_type: Record type to be searched. | 5757 | * @rec_type: Record type to be searched. |
5758 | * | 5758 | * |
5759 | * This function searches config region data to find the begining | 5759 | * This function searches config region data to find the beginning |
5760 | * of the record specified by record_type. If record found, this | 5760 | * of the record specified by record_type. If record found, this |
5761 | * function return pointer to the record else return NULL. | 5761 | * function return pointer to the record else return NULL. |
5762 | */ | 5762 | */ |
diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h index 94ae37c5111a..95f11ed79463 100644 --- a/drivers/scsi/lpfc/lpfc_hw.h +++ b/drivers/scsi/lpfc/lpfc_hw.h | |||
@@ -1344,7 +1344,7 @@ typedef struct { /* FireFly BIU registers */ | |||
1344 | #define HS_FFER1 0x80000000 /* Bit 31 */ | 1344 | #define HS_FFER1 0x80000000 /* Bit 31 */ |
1345 | #define HS_CRIT_TEMP 0x00000100 /* Bit 8 */ | 1345 | #define HS_CRIT_TEMP 0x00000100 /* Bit 8 */ |
1346 | #define HS_FFERM 0xFF000100 /* Mask for error bits 31:24 and 8 */ | 1346 | #define HS_FFERM 0xFF000100 /* Mask for error bits 31:24 and 8 */ |
1347 | 1347 | #define UNPLUG_ERR 0x00000001 /* Indicate pci hot unplug */ | |
1348 | /* Host Control Register */ | 1348 | /* Host Control Register */ |
1349 | 1349 | ||
1350 | #define HC_REG_OFFSET 12 /* Byte offset from register base address */ | 1350 | #define HC_REG_OFFSET 12 /* Byte offset from register base address */ |
@@ -1713,6 +1713,17 @@ struct lpfc_pde6 { | |||
1713 | #define pde6_apptagval_WORD word2 | 1713 | #define pde6_apptagval_WORD word2 |
1714 | }; | 1714 | }; |
1715 | 1715 | ||
1716 | struct lpfc_pde7 { | ||
1717 | uint32_t word0; | ||
1718 | #define pde7_type_SHIFT 24 | ||
1719 | #define pde7_type_MASK 0x000000ff | ||
1720 | #define pde7_type_WORD word0 | ||
1721 | #define pde7_rsvd0_SHIFT 0 | ||
1722 | #define pde7_rsvd0_MASK 0x00ffffff | ||
1723 | #define pde7_rsvd0_WORD word0 | ||
1724 | uint32_t addrHigh; | ||
1725 | uint32_t addrLow; | ||
1726 | }; | ||
1716 | 1727 | ||
1717 | /* Structure for MB Command LOAD_SM and DOWN_LOAD */ | 1728 | /* Structure for MB Command LOAD_SM and DOWN_LOAD */ |
1718 | 1729 | ||
@@ -3621,7 +3632,7 @@ typedef struct _IOCB { /* IOCB structure */ | |||
3621 | ASYNCSTAT_FIELDS asyncstat; /* async_status iocb */ | 3632 | ASYNCSTAT_FIELDS asyncstat; /* async_status iocb */ |
3622 | QUE_XRI64_CX_FIELDS quexri64cx; /* que_xri64_cx fields */ | 3633 | QUE_XRI64_CX_FIELDS quexri64cx; /* que_xri64_cx fields */ |
3623 | struct rcv_seq64 rcvseq64; /* RCV_SEQ64 and RCV_CONT64 */ | 3634 | struct rcv_seq64 rcvseq64; /* RCV_SEQ64 and RCV_CONT64 */ |
3624 | struct sli4_bls_acc bls_acc; /* UNSOL ABTS BLS_ACC params */ | 3635 | struct sli4_bls_rsp bls_rsp; /* UNSOL ABTS BLS_RSP params */ |
3625 | uint32_t ulpWord[IOCB_WORD_SZ - 2]; /* generic 6 'words' */ | 3636 | uint32_t ulpWord[IOCB_WORD_SZ - 2]; /* generic 6 'words' */ |
3626 | } un; | 3637 | } un; |
3627 | union { | 3638 | union { |
diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h index c7178d60c7bf..8433ac0d9fb4 100644 --- a/drivers/scsi/lpfc/lpfc_hw4.h +++ b/drivers/scsi/lpfc/lpfc_hw4.h | |||
@@ -215,7 +215,7 @@ struct lpfc_sli4_flags { | |||
215 | #define lpfc_fip_flag_WORD word0 | 215 | #define lpfc_fip_flag_WORD word0 |
216 | }; | 216 | }; |
217 | 217 | ||
218 | struct sli4_bls_acc { | 218 | struct sli4_bls_rsp { |
219 | uint32_t word0_rsvd; /* Word0 must be reserved */ | 219 | uint32_t word0_rsvd; /* Word0 must be reserved */ |
220 | uint32_t word1; | 220 | uint32_t word1; |
221 | #define lpfc_abts_orig_SHIFT 0 | 221 | #define lpfc_abts_orig_SHIFT 0 |
@@ -231,6 +231,16 @@ struct sli4_bls_acc { | |||
231 | #define lpfc_abts_oxid_MASK 0x0000FFFF | 231 | #define lpfc_abts_oxid_MASK 0x0000FFFF |
232 | #define lpfc_abts_oxid_WORD word2 | 232 | #define lpfc_abts_oxid_WORD word2 |
233 | uint32_t word3; | 233 | uint32_t word3; |
234 | #define lpfc_vndr_code_SHIFT 0 | ||
235 | #define lpfc_vndr_code_MASK 0x000000FF | ||
236 | #define lpfc_vndr_code_WORD word3 | ||
237 | #define lpfc_rsn_expln_SHIFT 8 | ||
238 | #define lpfc_rsn_expln_MASK 0x000000FF | ||
239 | #define lpfc_rsn_expln_WORD word3 | ||
240 | #define lpfc_rsn_code_SHIFT 16 | ||
241 | #define lpfc_rsn_code_MASK 0x000000FF | ||
242 | #define lpfc_rsn_code_WORD word3 | ||
243 | |||
234 | uint32_t word4; | 244 | uint32_t word4; |
235 | uint32_t word5_rsvd; /* Word5 must be reserved */ | 245 | uint32_t word5_rsvd; /* Word5 must be reserved */ |
236 | }; | 246 | }; |
@@ -711,21 +721,27 @@ struct lpfc_sli4_cfg_mhdr { | |||
711 | union lpfc_sli4_cfg_shdr { | 721 | union lpfc_sli4_cfg_shdr { |
712 | struct { | 722 | struct { |
713 | uint32_t word6; | 723 | uint32_t word6; |
714 | #define lpfc_mbox_hdr_opcode_SHIFT 0 | 724 | #define lpfc_mbox_hdr_opcode_SHIFT 0 |
715 | #define lpfc_mbox_hdr_opcode_MASK 0x000000FF | 725 | #define lpfc_mbox_hdr_opcode_MASK 0x000000FF |
716 | #define lpfc_mbox_hdr_opcode_WORD word6 | 726 | #define lpfc_mbox_hdr_opcode_WORD word6 |
717 | #define lpfc_mbox_hdr_subsystem_SHIFT 8 | 727 | #define lpfc_mbox_hdr_subsystem_SHIFT 8 |
718 | #define lpfc_mbox_hdr_subsystem_MASK 0x000000FF | 728 | #define lpfc_mbox_hdr_subsystem_MASK 0x000000FF |
719 | #define lpfc_mbox_hdr_subsystem_WORD word6 | 729 | #define lpfc_mbox_hdr_subsystem_WORD word6 |
720 | #define lpfc_mbox_hdr_port_number_SHIFT 16 | 730 | #define lpfc_mbox_hdr_port_number_SHIFT 16 |
721 | #define lpfc_mbox_hdr_port_number_MASK 0x000000FF | 731 | #define lpfc_mbox_hdr_port_number_MASK 0x000000FF |
722 | #define lpfc_mbox_hdr_port_number_WORD word6 | 732 | #define lpfc_mbox_hdr_port_number_WORD word6 |
723 | #define lpfc_mbox_hdr_domain_SHIFT 24 | 733 | #define lpfc_mbox_hdr_domain_SHIFT 24 |
724 | #define lpfc_mbox_hdr_domain_MASK 0x000000FF | 734 | #define lpfc_mbox_hdr_domain_MASK 0x000000FF |
725 | #define lpfc_mbox_hdr_domain_WORD word6 | 735 | #define lpfc_mbox_hdr_domain_WORD word6 |
726 | uint32_t timeout; | 736 | uint32_t timeout; |
727 | uint32_t request_length; | 737 | uint32_t request_length; |
728 | uint32_t reserved9; | 738 | uint32_t word9; |
739 | #define lpfc_mbox_hdr_version_SHIFT 0 | ||
740 | #define lpfc_mbox_hdr_version_MASK 0x000000FF | ||
741 | #define lpfc_mbox_hdr_version_WORD word9 | ||
742 | #define LPFC_Q_CREATE_VERSION_2 2 | ||
743 | #define LPFC_Q_CREATE_VERSION_1 1 | ||
744 | #define LPFC_Q_CREATE_VERSION_0 0 | ||
729 | } request; | 745 | } request; |
730 | struct { | 746 | struct { |
731 | uint32_t word6; | 747 | uint32_t word6; |
@@ -917,9 +933,12 @@ struct cq_context { | |||
917 | #define LPFC_CQ_CNT_512 0x1 | 933 | #define LPFC_CQ_CNT_512 0x1 |
918 | #define LPFC_CQ_CNT_1024 0x2 | 934 | #define LPFC_CQ_CNT_1024 0x2 |
919 | uint32_t word1; | 935 | uint32_t word1; |
920 | #define lpfc_cq_eq_id_SHIFT 22 | 936 | #define lpfc_cq_eq_id_SHIFT 22 /* Version 0 Only */ |
921 | #define lpfc_cq_eq_id_MASK 0x000000FF | 937 | #define lpfc_cq_eq_id_MASK 0x000000FF |
922 | #define lpfc_cq_eq_id_WORD word1 | 938 | #define lpfc_cq_eq_id_WORD word1 |
939 | #define lpfc_cq_eq_id_2_SHIFT 0 /* Version 2 Only */ | ||
940 | #define lpfc_cq_eq_id_2_MASK 0x0000FFFF | ||
941 | #define lpfc_cq_eq_id_2_WORD word1 | ||
923 | uint32_t reserved0; | 942 | uint32_t reserved0; |
924 | uint32_t reserved1; | 943 | uint32_t reserved1; |
925 | }; | 944 | }; |
@@ -929,6 +948,9 @@ struct lpfc_mbx_cq_create { | |||
929 | union { | 948 | union { |
930 | struct { | 949 | struct { |
931 | uint32_t word0; | 950 | uint32_t word0; |
951 | #define lpfc_mbx_cq_create_page_size_SHIFT 16 /* Version 2 Only */ | ||
952 | #define lpfc_mbx_cq_create_page_size_MASK 0x000000FF | ||
953 | #define lpfc_mbx_cq_create_page_size_WORD word0 | ||
932 | #define lpfc_mbx_cq_create_num_pages_SHIFT 0 | 954 | #define lpfc_mbx_cq_create_num_pages_SHIFT 0 |
933 | #define lpfc_mbx_cq_create_num_pages_MASK 0x0000FFFF | 955 | #define lpfc_mbx_cq_create_num_pages_MASK 0x0000FFFF |
934 | #define lpfc_mbx_cq_create_num_pages_WORD word0 | 956 | #define lpfc_mbx_cq_create_num_pages_WORD word0 |
@@ -969,7 +991,7 @@ struct wq_context { | |||
969 | struct lpfc_mbx_wq_create { | 991 | struct lpfc_mbx_wq_create { |
970 | struct mbox_header header; | 992 | struct mbox_header header; |
971 | union { | 993 | union { |
972 | struct { | 994 | struct { /* Version 0 Request */ |
973 | uint32_t word0; | 995 | uint32_t word0; |
974 | #define lpfc_mbx_wq_create_num_pages_SHIFT 0 | 996 | #define lpfc_mbx_wq_create_num_pages_SHIFT 0 |
975 | #define lpfc_mbx_wq_create_num_pages_MASK 0x0000FFFF | 997 | #define lpfc_mbx_wq_create_num_pages_MASK 0x0000FFFF |
@@ -979,6 +1001,23 @@ struct lpfc_mbx_wq_create { | |||
979 | #define lpfc_mbx_wq_create_cq_id_WORD word0 | 1001 | #define lpfc_mbx_wq_create_cq_id_WORD word0 |
980 | struct dma_address page[LPFC_MAX_WQ_PAGE]; | 1002 | struct dma_address page[LPFC_MAX_WQ_PAGE]; |
981 | } request; | 1003 | } request; |
1004 | struct { /* Version 1 Request */ | ||
1005 | uint32_t word0; /* Word 0 is the same as in v0 */ | ||
1006 | uint32_t word1; | ||
1007 | #define lpfc_mbx_wq_create_page_size_SHIFT 0 | ||
1008 | #define lpfc_mbx_wq_create_page_size_MASK 0x000000FF | ||
1009 | #define lpfc_mbx_wq_create_page_size_WORD word1 | ||
1010 | #define lpfc_mbx_wq_create_wqe_size_SHIFT 8 | ||
1011 | #define lpfc_mbx_wq_create_wqe_size_MASK 0x0000000F | ||
1012 | #define lpfc_mbx_wq_create_wqe_size_WORD word1 | ||
1013 | #define LPFC_WQ_WQE_SIZE_64 0x5 | ||
1014 | #define LPFC_WQ_WQE_SIZE_128 0x6 | ||
1015 | #define lpfc_mbx_wq_create_wqe_count_SHIFT 16 | ||
1016 | #define lpfc_mbx_wq_create_wqe_count_MASK 0x0000FFFF | ||
1017 | #define lpfc_mbx_wq_create_wqe_count_WORD word1 | ||
1018 | uint32_t word2; | ||
1019 | struct dma_address page[LPFC_MAX_WQ_PAGE-1]; | ||
1020 | } request_1; | ||
982 | struct { | 1021 | struct { |
983 | uint32_t word0; | 1022 | uint32_t word0; |
984 | #define lpfc_mbx_wq_create_q_id_SHIFT 0 | 1023 | #define lpfc_mbx_wq_create_q_id_SHIFT 0 |
@@ -1007,13 +1046,22 @@ struct lpfc_mbx_wq_destroy { | |||
1007 | #define LPFC_DATA_BUF_SIZE 2048 | 1046 | #define LPFC_DATA_BUF_SIZE 2048 |
1008 | struct rq_context { | 1047 | struct rq_context { |
1009 | uint32_t word0; | 1048 | uint32_t word0; |
1010 | #define lpfc_rq_context_rq_size_SHIFT 16 | 1049 | #define lpfc_rq_context_rqe_count_SHIFT 16 /* Version 0 Only */ |
1011 | #define lpfc_rq_context_rq_size_MASK 0x0000000F | 1050 | #define lpfc_rq_context_rqe_count_MASK 0x0000000F |
1012 | #define lpfc_rq_context_rq_size_WORD word0 | 1051 | #define lpfc_rq_context_rqe_count_WORD word0 |
1013 | #define LPFC_RQ_RING_SIZE_512 9 /* 512 entries */ | 1052 | #define LPFC_RQ_RING_SIZE_512 9 /* 512 entries */ |
1014 | #define LPFC_RQ_RING_SIZE_1024 10 /* 1024 entries */ | 1053 | #define LPFC_RQ_RING_SIZE_1024 10 /* 1024 entries */ |
1015 | #define LPFC_RQ_RING_SIZE_2048 11 /* 2048 entries */ | 1054 | #define LPFC_RQ_RING_SIZE_2048 11 /* 2048 entries */ |
1016 | #define LPFC_RQ_RING_SIZE_4096 12 /* 4096 entries */ | 1055 | #define LPFC_RQ_RING_SIZE_4096 12 /* 4096 entries */ |
1056 | #define lpfc_rq_context_rqe_count_1_SHIFT 16 /* Version 1 Only */ | ||
1057 | #define lpfc_rq_context_rqe_count_1_MASK 0x0000FFFF | ||
1058 | #define lpfc_rq_context_rqe_count_1_WORD word0 | ||
1059 | #define lpfc_rq_context_rqe_size_SHIFT 8 /* Version 1 Only */ | ||
1060 | #define lpfc_rq_context_rqe_size_MASK 0x0000000F | ||
1061 | #define lpfc_rq_context_rqe_size_WORD word0 | ||
1062 | #define lpfc_rq_context_page_size_SHIFT 0 /* Version 1 Only */ | ||
1063 | #define lpfc_rq_context_page_size_MASK 0x000000FF | ||
1064 | #define lpfc_rq_context_page_size_WORD word0 | ||
1017 | uint32_t reserved1; | 1065 | uint32_t reserved1; |
1018 | uint32_t word2; | 1066 | uint32_t word2; |
1019 | #define lpfc_rq_context_cq_id_SHIFT 16 | 1067 | #define lpfc_rq_context_cq_id_SHIFT 16 |
@@ -1022,7 +1070,7 @@ struct rq_context { | |||
1022 | #define lpfc_rq_context_buf_size_SHIFT 0 | 1070 | #define lpfc_rq_context_buf_size_SHIFT 0 |
1023 | #define lpfc_rq_context_buf_size_MASK 0x0000FFFF | 1071 | #define lpfc_rq_context_buf_size_MASK 0x0000FFFF |
1024 | #define lpfc_rq_context_buf_size_WORD word2 | 1072 | #define lpfc_rq_context_buf_size_WORD word2 |
1025 | uint32_t reserved3; | 1073 | uint32_t buffer_size; /* Version 1 Only */ |
1026 | }; | 1074 | }; |
1027 | 1075 | ||
1028 | struct lpfc_mbx_rq_create { | 1076 | struct lpfc_mbx_rq_create { |
@@ -1062,16 +1110,16 @@ struct lpfc_mbx_rq_destroy { | |||
1062 | 1110 | ||
1063 | struct mq_context { | 1111 | struct mq_context { |
1064 | uint32_t word0; | 1112 | uint32_t word0; |
1065 | #define lpfc_mq_context_cq_id_SHIFT 22 | 1113 | #define lpfc_mq_context_cq_id_SHIFT 22 /* Version 0 Only */ |
1066 | #define lpfc_mq_context_cq_id_MASK 0x000003FF | 1114 | #define lpfc_mq_context_cq_id_MASK 0x000003FF |
1067 | #define lpfc_mq_context_cq_id_WORD word0 | 1115 | #define lpfc_mq_context_cq_id_WORD word0 |
1068 | #define lpfc_mq_context_count_SHIFT 16 | 1116 | #define lpfc_mq_context_ring_size_SHIFT 16 |
1069 | #define lpfc_mq_context_count_MASK 0x0000000F | 1117 | #define lpfc_mq_context_ring_size_MASK 0x0000000F |
1070 | #define lpfc_mq_context_count_WORD word0 | 1118 | #define lpfc_mq_context_ring_size_WORD word0 |
1071 | #define LPFC_MQ_CNT_16 0x5 | 1119 | #define LPFC_MQ_RING_SIZE_16 0x5 |
1072 | #define LPFC_MQ_CNT_32 0x6 | 1120 | #define LPFC_MQ_RING_SIZE_32 0x6 |
1073 | #define LPFC_MQ_CNT_64 0x7 | 1121 | #define LPFC_MQ_RING_SIZE_64 0x7 |
1074 | #define LPFC_MQ_CNT_128 0x8 | 1122 | #define LPFC_MQ_RING_SIZE_128 0x8 |
1075 | uint32_t word1; | 1123 | uint32_t word1; |
1076 | #define lpfc_mq_context_valid_SHIFT 31 | 1124 | #define lpfc_mq_context_valid_SHIFT 31 |
1077 | #define lpfc_mq_context_valid_MASK 0x00000001 | 1125 | #define lpfc_mq_context_valid_MASK 0x00000001 |
@@ -1105,9 +1153,12 @@ struct lpfc_mbx_mq_create_ext { | |||
1105 | union { | 1153 | union { |
1106 | struct { | 1154 | struct { |
1107 | uint32_t word0; | 1155 | uint32_t word0; |
1108 | #define lpfc_mbx_mq_create_ext_num_pages_SHIFT 0 | 1156 | #define lpfc_mbx_mq_create_ext_num_pages_SHIFT 0 |
1109 | #define lpfc_mbx_mq_create_ext_num_pages_MASK 0x0000FFFF | 1157 | #define lpfc_mbx_mq_create_ext_num_pages_MASK 0x0000FFFF |
1110 | #define lpfc_mbx_mq_create_ext_num_pages_WORD word0 | 1158 | #define lpfc_mbx_mq_create_ext_num_pages_WORD word0 |
1159 | #define lpfc_mbx_mq_create_ext_cq_id_SHIFT 16 /* Version 1 Only */ | ||
1160 | #define lpfc_mbx_mq_create_ext_cq_id_MASK 0x0000FFFF | ||
1161 | #define lpfc_mbx_mq_create_ext_cq_id_WORD word0 | ||
1111 | uint32_t async_evt_bmap; | 1162 | uint32_t async_evt_bmap; |
1112 | #define lpfc_mbx_mq_create_ext_async_evt_link_SHIFT LPFC_TRAILER_CODE_LINK | 1163 | #define lpfc_mbx_mq_create_ext_async_evt_link_SHIFT LPFC_TRAILER_CODE_LINK |
1113 | #define lpfc_mbx_mq_create_ext_async_evt_link_MASK 0x00000001 | 1164 | #define lpfc_mbx_mq_create_ext_async_evt_link_MASK 0x00000001 |
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 35665cfb5689..505f88443b5c 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2010 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2011 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
@@ -507,7 +507,10 @@ lpfc_config_port_post(struct lpfc_hba *phba) | |||
507 | phba->hba_flag &= ~HBA_ERATT_HANDLED; | 507 | phba->hba_flag &= ~HBA_ERATT_HANDLED; |
508 | 508 | ||
509 | /* Enable appropriate host interrupts */ | 509 | /* Enable appropriate host interrupts */ |
510 | status = readl(phba->HCregaddr); | 510 | if (lpfc_readl(phba->HCregaddr, &status)) { |
511 | spin_unlock_irq(&phba->hbalock); | ||
512 | return -EIO; | ||
513 | } | ||
511 | status |= HC_MBINT_ENA | HC_ERINT_ENA | HC_LAINT_ENA; | 514 | status |= HC_MBINT_ENA | HC_ERINT_ENA | HC_LAINT_ENA; |
512 | if (psli->num_rings > 0) | 515 | if (psli->num_rings > 0) |
513 | status |= HC_R0INT_ENA; | 516 | status |= HC_R0INT_ENA; |
@@ -1222,7 +1225,10 @@ lpfc_handle_deferred_eratt(struct lpfc_hba *phba) | |||
1222 | /* Wait for the ER1 bit to clear.*/ | 1225 | /* Wait for the ER1 bit to clear.*/ |
1223 | while (phba->work_hs & HS_FFER1) { | 1226 | while (phba->work_hs & HS_FFER1) { |
1224 | msleep(100); | 1227 | msleep(100); |
1225 | phba->work_hs = readl(phba->HSregaddr); | 1228 | if (lpfc_readl(phba->HSregaddr, &phba->work_hs)) { |
1229 | phba->work_hs = UNPLUG_ERR ; | ||
1230 | break; | ||
1231 | } | ||
1226 | /* If driver is unloading let the worker thread continue */ | 1232 | /* If driver is unloading let the worker thread continue */ |
1227 | if (phba->pport->load_flag & FC_UNLOADING) { | 1233 | if (phba->pport->load_flag & FC_UNLOADING) { |
1228 | phba->work_hs = 0; | 1234 | phba->work_hs = 0; |
@@ -4460,7 +4466,7 @@ lpfc_sli4_driver_resource_unset(struct lpfc_hba *phba) | |||
4460 | } | 4466 | } |
4461 | 4467 | ||
4462 | /** | 4468 | /** |
4463 | * lpfc_init_api_table_setup - Set up init api fucntion jump table | 4469 | * lpfc_init_api_table_setup - Set up init api function jump table |
4464 | * @phba: The hba struct for which this call is being executed. | 4470 | * @phba: The hba struct for which this call is being executed. |
4465 | * @dev_grp: The HBA PCI-Device group number. | 4471 | * @dev_grp: The HBA PCI-Device group number. |
4466 | * | 4472 | * |
@@ -4474,6 +4480,7 @@ lpfc_init_api_table_setup(struct lpfc_hba *phba, uint8_t dev_grp) | |||
4474 | { | 4480 | { |
4475 | phba->lpfc_hba_init_link = lpfc_hba_init_link; | 4481 | phba->lpfc_hba_init_link = lpfc_hba_init_link; |
4476 | phba->lpfc_hba_down_link = lpfc_hba_down_link; | 4482 | phba->lpfc_hba_down_link = lpfc_hba_down_link; |
4483 | phba->lpfc_selective_reset = lpfc_selective_reset; | ||
4477 | switch (dev_grp) { | 4484 | switch (dev_grp) { |
4478 | case LPFC_PCI_DEV_LP: | 4485 | case LPFC_PCI_DEV_LP: |
4479 | phba->lpfc_hba_down_post = lpfc_hba_down_post_s3; | 4486 | phba->lpfc_hba_down_post = lpfc_hba_down_post_s3; |
@@ -4843,7 +4850,7 @@ out_free_mem: | |||
4843 | * | 4850 | * |
4844 | * Return codes | 4851 | * Return codes |
4845 | * 0 - successful | 4852 | * 0 - successful |
4846 | * -ENOMEM - No availble memory | 4853 | * -ENOMEM - No available memory |
4847 | * -EIO - The mailbox failed to complete successfully. | 4854 | * -EIO - The mailbox failed to complete successfully. |
4848 | **/ | 4855 | **/ |
4849 | int | 4856 | int |
@@ -5385,13 +5392,16 @@ lpfc_sli4_post_status_check(struct lpfc_hba *phba) | |||
5385 | int i, port_error = 0; | 5392 | int i, port_error = 0; |
5386 | uint32_t if_type; | 5393 | uint32_t if_type; |
5387 | 5394 | ||
5395 | memset(&portsmphr_reg, 0, sizeof(portsmphr_reg)); | ||
5396 | memset(®_data, 0, sizeof(reg_data)); | ||
5388 | if (!phba->sli4_hba.PSMPHRregaddr) | 5397 | if (!phba->sli4_hba.PSMPHRregaddr) |
5389 | return -ENODEV; | 5398 | return -ENODEV; |
5390 | 5399 | ||
5391 | /* Wait up to 30 seconds for the SLI Port POST done and ready */ | 5400 | /* Wait up to 30 seconds for the SLI Port POST done and ready */ |
5392 | for (i = 0; i < 3000; i++) { | 5401 | for (i = 0; i < 3000; i++) { |
5393 | portsmphr_reg.word0 = readl(phba->sli4_hba.PSMPHRregaddr); | 5402 | if (lpfc_readl(phba->sli4_hba.PSMPHRregaddr, |
5394 | if (bf_get(lpfc_port_smphr_perr, &portsmphr_reg)) { | 5403 | &portsmphr_reg.word0) || |
5404 | (bf_get(lpfc_port_smphr_perr, &portsmphr_reg))) { | ||
5395 | /* Port has a fatal POST error, break out */ | 5405 | /* Port has a fatal POST error, break out */ |
5396 | port_error = -ENODEV; | 5406 | port_error = -ENODEV; |
5397 | break; | 5407 | break; |
@@ -5472,9 +5482,9 @@ lpfc_sli4_post_status_check(struct lpfc_hba *phba) | |||
5472 | break; | 5482 | break; |
5473 | case LPFC_SLI_INTF_IF_TYPE_2: | 5483 | case LPFC_SLI_INTF_IF_TYPE_2: |
5474 | /* Final checks. The port status should be clean. */ | 5484 | /* Final checks. The port status should be clean. */ |
5475 | reg_data.word0 = | 5485 | if (lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr, |
5476 | readl(phba->sli4_hba.u.if_type2.STATUSregaddr); | 5486 | ®_data.word0) || |
5477 | if (bf_get(lpfc_sliport_status_err, ®_data)) { | 5487 | bf_get(lpfc_sliport_status_err, ®_data)) { |
5478 | phba->work_status[0] = | 5488 | phba->work_status[0] = |
5479 | readl(phba->sli4_hba.u.if_type2. | 5489 | readl(phba->sli4_hba.u.if_type2. |
5480 | ERR1regaddr); | 5490 | ERR1regaddr); |
@@ -5720,7 +5730,7 @@ lpfc_destroy_bootstrap_mbox(struct lpfc_hba *phba) | |||
5720 | * | 5730 | * |
5721 | * Return codes | 5731 | * Return codes |
5722 | * 0 - successful | 5732 | * 0 - successful |
5723 | * -ENOMEM - No availble memory | 5733 | * -ENOMEM - No available memory |
5724 | * -EIO - The mailbox failed to complete successfully. | 5734 | * -EIO - The mailbox failed to complete successfully. |
5725 | **/ | 5735 | **/ |
5726 | static int | 5736 | static int |
@@ -5825,7 +5835,7 @@ lpfc_sli4_read_config(struct lpfc_hba *phba) | |||
5825 | * | 5835 | * |
5826 | * Return codes | 5836 | * Return codes |
5827 | * 0 - successful | 5837 | * 0 - successful |
5828 | * -ENOMEM - No availble memory | 5838 | * -ENOMEM - No available memory |
5829 | * -EIO - The mailbox failed to complete successfully. | 5839 | * -EIO - The mailbox failed to complete successfully. |
5830 | **/ | 5840 | **/ |
5831 | static int | 5841 | static int |
@@ -5884,7 +5894,7 @@ lpfc_setup_endian_order(struct lpfc_hba *phba) | |||
5884 | * | 5894 | * |
5885 | * Return codes | 5895 | * Return codes |
5886 | * 0 - successful | 5896 | * 0 - successful |
5887 | * -ENOMEM - No availble memory | 5897 | * -ENOMEM - No available memory |
5888 | * -EIO - The mailbox failed to complete successfully. | 5898 | * -EIO - The mailbox failed to complete successfully. |
5889 | **/ | 5899 | **/ |
5890 | static int | 5900 | static int |
@@ -6179,7 +6189,7 @@ out_error: | |||
6179 | * | 6189 | * |
6180 | * Return codes | 6190 | * Return codes |
6181 | * 0 - successful | 6191 | * 0 - successful |
6182 | * -ENOMEM - No availble memory | 6192 | * -ENOMEM - No available memory |
6183 | * -EIO - The mailbox failed to complete successfully. | 6193 | * -EIO - The mailbox failed to complete successfully. |
6184 | **/ | 6194 | **/ |
6185 | static void | 6195 | static void |
@@ -6243,7 +6253,7 @@ lpfc_sli4_queue_destroy(struct lpfc_hba *phba) | |||
6243 | * | 6253 | * |
6244 | * Return codes | 6254 | * Return codes |
6245 | * 0 - successful | 6255 | * 0 - successful |
6246 | * -ENOMEM - No availble memory | 6256 | * -ENOMEM - No available memory |
6247 | * -EIO - The mailbox failed to complete successfully. | 6257 | * -EIO - The mailbox failed to complete successfully. |
6248 | **/ | 6258 | **/ |
6249 | int | 6259 | int |
@@ -6488,7 +6498,7 @@ out_error: | |||
6488 | * | 6498 | * |
6489 | * Return codes | 6499 | * Return codes |
6490 | * 0 - successful | 6500 | * 0 - successful |
6491 | * -ENOMEM - No availble memory | 6501 | * -ENOMEM - No available memory |
6492 | * -EIO - The mailbox failed to complete successfully. | 6502 | * -EIO - The mailbox failed to complete successfully. |
6493 | **/ | 6503 | **/ |
6494 | void | 6504 | void |
@@ -6533,7 +6543,7 @@ lpfc_sli4_queue_unset(struct lpfc_hba *phba) | |||
6533 | * | 6543 | * |
6534 | * Return codes | 6544 | * Return codes |
6535 | * 0 - successful | 6545 | * 0 - successful |
6536 | * -ENOMEM - No availble memory | 6546 | * -ENOMEM - No available memory |
6537 | **/ | 6547 | **/ |
6538 | static int | 6548 | static int |
6539 | lpfc_sli4_cq_event_pool_create(struct lpfc_hba *phba) | 6549 | lpfc_sli4_cq_event_pool_create(struct lpfc_hba *phba) |
@@ -6694,7 +6704,7 @@ lpfc_sli4_cq_event_release_all(struct lpfc_hba *phba) | |||
6694 | * | 6704 | * |
6695 | * Return codes | 6705 | * Return codes |
6696 | * 0 - successful | 6706 | * 0 - successful |
6697 | * -ENOMEM - No availble memory | 6707 | * -ENOMEM - No available memory |
6698 | * -EIO - The mailbox failed to complete successfully. | 6708 | * -EIO - The mailbox failed to complete successfully. |
6699 | **/ | 6709 | **/ |
6700 | int | 6710 | int |
@@ -6760,9 +6770,11 @@ lpfc_pci_function_reset(struct lpfc_hba *phba) | |||
6760 | * the loop again. | 6770 | * the loop again. |
6761 | */ | 6771 | */ |
6762 | for (rdy_chk = 0; rdy_chk < 1000; rdy_chk++) { | 6772 | for (rdy_chk = 0; rdy_chk < 1000; rdy_chk++) { |
6763 | reg_data.word0 = | 6773 | if (lpfc_readl(phba->sli4_hba.u.if_type2. |
6764 | readl(phba->sli4_hba.u.if_type2. | 6774 | STATUSregaddr, ®_data.word0)) { |
6765 | STATUSregaddr); | 6775 | rc = -ENODEV; |
6776 | break; | ||
6777 | } | ||
6766 | if (bf_get(lpfc_sliport_status_rdy, ®_data)) | 6778 | if (bf_get(lpfc_sliport_status_rdy, ®_data)) |
6767 | break; | 6779 | break; |
6768 | if (bf_get(lpfc_sliport_status_rn, ®_data)) { | 6780 | if (bf_get(lpfc_sliport_status_rn, ®_data)) { |
@@ -6783,8 +6795,11 @@ lpfc_pci_function_reset(struct lpfc_hba *phba) | |||
6783 | } | 6795 | } |
6784 | 6796 | ||
6785 | /* Detect any port errors. */ | 6797 | /* Detect any port errors. */ |
6786 | reg_data.word0 = readl(phba->sli4_hba.u.if_type2. | 6798 | if (lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr, |
6787 | STATUSregaddr); | 6799 | ®_data.word0)) { |
6800 | rc = -ENODEV; | ||
6801 | break; | ||
6802 | } | ||
6788 | if ((bf_get(lpfc_sliport_status_err, ®_data)) || | 6803 | if ((bf_get(lpfc_sliport_status_err, ®_data)) || |
6789 | (rdy_chk >= 1000)) { | 6804 | (rdy_chk >= 1000)) { |
6790 | phba->work_status[0] = readl( | 6805 | phba->work_status[0] = readl( |
diff --git a/drivers/scsi/lpfc/lpfc_mbox.c b/drivers/scsi/lpfc/lpfc_mbox.c index dba32dfdb59b..fbab9734e9b4 100644 --- a/drivers/scsi/lpfc/lpfc_mbox.c +++ b/drivers/scsi/lpfc/lpfc_mbox.c | |||
@@ -1834,7 +1834,7 @@ lpfc_sli4_mbox_opcode_get(struct lpfc_hba *phba, struct lpfcMboxq *mbox) | |||
1834 | * @fcf_index: index to fcf table. | 1834 | * @fcf_index: index to fcf table. |
1835 | * | 1835 | * |
1836 | * This routine routine allocates and constructs non-embedded mailbox command | 1836 | * This routine routine allocates and constructs non-embedded mailbox command |
1837 | * for reading a FCF table entry refered by @fcf_index. | 1837 | * for reading a FCF table entry referred by @fcf_index. |
1838 | * | 1838 | * |
1839 | * Return: pointer to the mailbox command constructed if successful, otherwise | 1839 | * Return: pointer to the mailbox command constructed if successful, otherwise |
1840 | * NULL. | 1840 | * NULL. |
diff --git a/drivers/scsi/lpfc/lpfc_nl.h b/drivers/scsi/lpfc/lpfc_nl.h index f3cfbe2ce986..f2b1bbcb196f 100644 --- a/drivers/scsi/lpfc/lpfc_nl.h +++ b/drivers/scsi/lpfc/lpfc_nl.h | |||
@@ -50,7 +50,7 @@ | |||
50 | * and subcategory. The event type must come first. | 50 | * and subcategory. The event type must come first. |
51 | * The subcategory further defines the data that follows in the rest | 51 | * The subcategory further defines the data that follows in the rest |
52 | * of the payload. Each category will have its own unique header plus | 52 | * of the payload. Each category will have its own unique header plus |
53 | * any addtional data unique to the subcategory. | 53 | * any additional data unique to the subcategory. |
54 | * The payload sent via the fc transport is one-way driver->application. | 54 | * The payload sent via the fc transport is one-way driver->application. |
55 | */ | 55 | */ |
56 | 56 | ||
diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c index 52b35159fc35..0d92d4205ea6 100644 --- a/drivers/scsi/lpfc/lpfc_nportdisc.c +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c | |||
@@ -658,7 +658,7 @@ lpfc_disc_set_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) | |||
658 | return 0; | 658 | return 0; |
659 | } | 659 | } |
660 | /** | 660 | /** |
661 | * lpfc_release_rpi - Release a RPI by issueing unreg_login mailbox cmd. | 661 | * lpfc_release_rpi - Release a RPI by issuing unreg_login mailbox cmd. |
662 | * @phba : Pointer to lpfc_hba structure. | 662 | * @phba : Pointer to lpfc_hba structure. |
663 | * @vport: Pointer to lpfc_vport structure. | 663 | * @vport: Pointer to lpfc_vport structure. |
664 | * @rpi : rpi to be release. | 664 | * @rpi : rpi to be release. |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index bf34178b80bf..fe7cc84e773b 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2009 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2011 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
@@ -577,7 +577,7 @@ lpfc_new_scsi_buf_s3(struct lpfc_vport *vport, int num_to_alloc) | |||
577 | iocb->un.fcpi64.bdl.addrHigh = 0; | 577 | iocb->un.fcpi64.bdl.addrHigh = 0; |
578 | iocb->ulpBdeCount = 0; | 578 | iocb->ulpBdeCount = 0; |
579 | iocb->ulpLe = 0; | 579 | iocb->ulpLe = 0; |
580 | /* fill in responce BDE */ | 580 | /* fill in response BDE */ |
581 | iocb->unsli3.fcp_ext.rbde.tus.f.bdeFlags = | 581 | iocb->unsli3.fcp_ext.rbde.tus.f.bdeFlags = |
582 | BUFF_TYPE_BDE_64; | 582 | BUFF_TYPE_BDE_64; |
583 | iocb->unsli3.fcp_ext.rbde.tus.f.bdeSize = | 583 | iocb->unsli3.fcp_ext.rbde.tus.f.bdeSize = |
@@ -1217,10 +1217,10 @@ lpfc_scsi_prep_dma_buf_s3(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) | |||
1217 | (2 * sizeof(struct ulp_bde64))); | 1217 | (2 * sizeof(struct ulp_bde64))); |
1218 | data_bde->addrHigh = putPaddrHigh(physaddr); | 1218 | data_bde->addrHigh = putPaddrHigh(physaddr); |
1219 | data_bde->addrLow = putPaddrLow(physaddr); | 1219 | data_bde->addrLow = putPaddrLow(physaddr); |
1220 | /* ebde count includes the responce bde and data bpl */ | 1220 | /* ebde count includes the response bde and data bpl */ |
1221 | iocb_cmd->unsli3.fcp_ext.ebde_count = 2; | 1221 | iocb_cmd->unsli3.fcp_ext.ebde_count = 2; |
1222 | } else { | 1222 | } else { |
1223 | /* ebde count includes the responce bde and data bdes */ | 1223 | /* ebde count includes the response bde and data bdes */ |
1224 | iocb_cmd->unsli3.fcp_ext.ebde_count = (num_bde + 1); | 1224 | iocb_cmd->unsli3.fcp_ext.ebde_count = (num_bde + 1); |
1225 | } | 1225 | } |
1226 | } else { | 1226 | } else { |
@@ -1514,10 +1514,11 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
1514 | struct scatterlist *sgpe = NULL; /* s/g prot entry */ | 1514 | struct scatterlist *sgpe = NULL; /* s/g prot entry */ |
1515 | struct lpfc_pde5 *pde5 = NULL; | 1515 | struct lpfc_pde5 *pde5 = NULL; |
1516 | struct lpfc_pde6 *pde6 = NULL; | 1516 | struct lpfc_pde6 *pde6 = NULL; |
1517 | struct ulp_bde64 *prot_bde = NULL; | 1517 | struct lpfc_pde7 *pde7 = NULL; |
1518 | dma_addr_t dataphysaddr, protphysaddr; | 1518 | dma_addr_t dataphysaddr, protphysaddr; |
1519 | unsigned short curr_data = 0, curr_prot = 0; | 1519 | unsigned short curr_data = 0, curr_prot = 0; |
1520 | unsigned int split_offset, protgroup_len; | 1520 | unsigned int split_offset; |
1521 | unsigned int protgroup_len, protgroup_offset = 0, protgroup_remainder; | ||
1521 | unsigned int protgrp_blks, protgrp_bytes; | 1522 | unsigned int protgrp_blks, protgrp_bytes; |
1522 | unsigned int remainder, subtotal; | 1523 | unsigned int remainder, subtotal; |
1523 | int status; | 1524 | int status; |
@@ -1585,23 +1586,33 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
1585 | bpl++; | 1586 | bpl++; |
1586 | 1587 | ||
1587 | /* setup the first BDE that points to protection buffer */ | 1588 | /* setup the first BDE that points to protection buffer */ |
1588 | prot_bde = (struct ulp_bde64 *) bpl; | 1589 | protphysaddr = sg_dma_address(sgpe) + protgroup_offset; |
1589 | protphysaddr = sg_dma_address(sgpe); | 1590 | protgroup_len = sg_dma_len(sgpe) - protgroup_offset; |
1590 | prot_bde->addrHigh = le32_to_cpu(putPaddrLow(protphysaddr)); | ||
1591 | prot_bde->addrLow = le32_to_cpu(putPaddrHigh(protphysaddr)); | ||
1592 | protgroup_len = sg_dma_len(sgpe); | ||
1593 | 1591 | ||
1594 | /* must be integer multiple of the DIF block length */ | 1592 | /* must be integer multiple of the DIF block length */ |
1595 | BUG_ON(protgroup_len % 8); | 1593 | BUG_ON(protgroup_len % 8); |
1596 | 1594 | ||
1595 | pde7 = (struct lpfc_pde7 *) bpl; | ||
1596 | memset(pde7, 0, sizeof(struct lpfc_pde7)); | ||
1597 | bf_set(pde7_type, pde7, LPFC_PDE7_DESCRIPTOR); | ||
1598 | |||
1599 | pde7->addrHigh = le32_to_cpu(putPaddrLow(protphysaddr)); | ||
1600 | pde7->addrLow = le32_to_cpu(putPaddrHigh(protphysaddr)); | ||
1601 | |||
1597 | protgrp_blks = protgroup_len / 8; | 1602 | protgrp_blks = protgroup_len / 8; |
1598 | protgrp_bytes = protgrp_blks * blksize; | 1603 | protgrp_bytes = protgrp_blks * blksize; |
1599 | 1604 | ||
1600 | prot_bde->tus.f.bdeSize = protgroup_len; | 1605 | /* check if this pde is crossing the 4K boundary; if so split */ |
1601 | prot_bde->tus.f.bdeFlags = LPFC_PDE7_DESCRIPTOR; | 1606 | if ((pde7->addrLow & 0xfff) + protgroup_len > 0x1000) { |
1602 | prot_bde->tus.w = le32_to_cpu(bpl->tus.w); | 1607 | protgroup_remainder = 0x1000 - (pde7->addrLow & 0xfff); |
1608 | protgroup_offset += protgroup_remainder; | ||
1609 | protgrp_blks = protgroup_remainder / 8; | ||
1610 | protgrp_bytes = protgroup_remainder * blksize; | ||
1611 | } else { | ||
1612 | protgroup_offset = 0; | ||
1613 | curr_prot++; | ||
1614 | } | ||
1603 | 1615 | ||
1604 | curr_prot++; | ||
1605 | num_bde++; | 1616 | num_bde++; |
1606 | 1617 | ||
1607 | /* setup BDE's for data blocks associated with DIF data */ | 1618 | /* setup BDE's for data blocks associated with DIF data */ |
@@ -1653,6 +1664,13 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, | |||
1653 | 1664 | ||
1654 | } | 1665 | } |
1655 | 1666 | ||
1667 | if (protgroup_offset) { | ||
1668 | /* update the reference tag */ | ||
1669 | reftag += protgrp_blks; | ||
1670 | bpl++; | ||
1671 | continue; | ||
1672 | } | ||
1673 | |||
1656 | /* are we done ? */ | 1674 | /* are we done ? */ |
1657 | if (curr_prot == protcnt) { | 1675 | if (curr_prot == protcnt) { |
1658 | alldone = 1; | 1676 | alldone = 1; |
@@ -1675,6 +1693,7 @@ out: | |||
1675 | 1693 | ||
1676 | return num_bde; | 1694 | return num_bde; |
1677 | } | 1695 | } |
1696 | |||
1678 | /* | 1697 | /* |
1679 | * Given a SCSI command that supports DIF, determine composition of protection | 1698 | * Given a SCSI command that supports DIF, determine composition of protection |
1680 | * groups involved in setting up buffer lists | 1699 | * groups involved in setting up buffer lists |
@@ -2361,7 +2380,7 @@ lpfc_handle_fcp_err(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, | |||
2361 | } | 2380 | } |
2362 | /* | 2381 | /* |
2363 | * The cmnd->underflow is the minimum number of bytes that must | 2382 | * The cmnd->underflow is the minimum number of bytes that must |
2364 | * be transfered for this command. Provided a sense condition | 2383 | * be transferred for this command. Provided a sense condition |
2365 | * is not present, make sure the actual amount transferred is at | 2384 | * is not present, make sure the actual amount transferred is at |
2366 | * least the underflow value or fail. | 2385 | * least the underflow value or fail. |
2367 | */ | 2386 | */ |
@@ -2854,7 +2873,7 @@ lpfc_scsi_prep_task_mgmt_cmd(struct lpfc_vport *vport, | |||
2854 | } | 2873 | } |
2855 | 2874 | ||
2856 | /** | 2875 | /** |
2857 | * lpfc_scsi_api_table_setup - Set up scsi api fucntion jump table | 2876 | * lpfc_scsi_api_table_setup - Set up scsi api function jump table |
2858 | * @phba: The hba struct for which this call is being executed. | 2877 | * @phba: The hba struct for which this call is being executed. |
2859 | * @dev_grp: The HBA PCI-Device group number. | 2878 | * @dev_grp: The HBA PCI-Device group number. |
2860 | * | 2879 | * |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.h b/drivers/scsi/lpfc/lpfc_scsi.h index 5932273870a5..ce645b20a6ad 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.h +++ b/drivers/scsi/lpfc/lpfc_scsi.h | |||
@@ -130,7 +130,7 @@ struct lpfc_scsi_buf { | |||
130 | dma_addr_t nonsg_phys; /* Non scatter-gather physical address. */ | 130 | dma_addr_t nonsg_phys; /* Non scatter-gather physical address. */ |
131 | 131 | ||
132 | /* | 132 | /* |
133 | * data and dma_handle are the kernel virutal and bus address of the | 133 | * data and dma_handle are the kernel virtual and bus address of the |
134 | * dma-able buffer containing the fcp_cmd, fcp_rsp and a scatter | 134 | * dma-able buffer containing the fcp_cmd, fcp_rsp and a scatter |
135 | * gather bde list that supports the sg_tablesize value. | 135 | * gather bde list that supports the sg_tablesize value. |
136 | */ | 136 | */ |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 2ee0374a9908..dacabbe0a586 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2009 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2011 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
@@ -2817,7 +2817,7 @@ void lpfc_poll_eratt(unsigned long ptr) | |||
2817 | * This function is called from the interrupt context when there is a ring | 2817 | * This function is called from the interrupt context when there is a ring |
2818 | * event for the fcp ring. The caller does not hold any lock. | 2818 | * event for the fcp ring. The caller does not hold any lock. |
2819 | * The function processes each response iocb in the response ring until it | 2819 | * The function processes each response iocb in the response ring until it |
2820 | * finds an iocb with LE bit set and chains all the iocbs upto the iocb with | 2820 | * finds an iocb with LE bit set and chains all the iocbs up to the iocb with |
2821 | * LE bit set. The function will call the completion handler of the command iocb | 2821 | * LE bit set. The function will call the completion handler of the command iocb |
2822 | * if the response iocb indicates a completion for a command iocb or it is | 2822 | * if the response iocb indicates a completion for a command iocb or it is |
2823 | * an abort completion. The function will call lpfc_sli_process_unsol_iocb | 2823 | * an abort completion. The function will call lpfc_sli_process_unsol_iocb |
@@ -3477,7 +3477,8 @@ lpfc_sli_brdready_s3(struct lpfc_hba *phba, uint32_t mask) | |||
3477 | int retval = 0; | 3477 | int retval = 0; |
3478 | 3478 | ||
3479 | /* Read the HBA Host Status Register */ | 3479 | /* Read the HBA Host Status Register */ |
3480 | status = readl(phba->HSregaddr); | 3480 | if (lpfc_readl(phba->HSregaddr, &status)) |
3481 | return 1; | ||
3481 | 3482 | ||
3482 | /* | 3483 | /* |
3483 | * Check status register every 100ms for 5 retries, then every | 3484 | * Check status register every 100ms for 5 retries, then every |
@@ -3502,7 +3503,10 @@ lpfc_sli_brdready_s3(struct lpfc_hba *phba, uint32_t mask) | |||
3502 | lpfc_sli_brdrestart(phba); | 3503 | lpfc_sli_brdrestart(phba); |
3503 | } | 3504 | } |
3504 | /* Read the HBA Host Status Register */ | 3505 | /* Read the HBA Host Status Register */ |
3505 | status = readl(phba->HSregaddr); | 3506 | if (lpfc_readl(phba->HSregaddr, &status)) { |
3507 | retval = 1; | ||
3508 | break; | ||
3509 | } | ||
3506 | } | 3510 | } |
3507 | 3511 | ||
3508 | /* Check to see if any errors occurred during init */ | 3512 | /* Check to see if any errors occurred during init */ |
@@ -3584,7 +3588,7 @@ void lpfc_reset_barrier(struct lpfc_hba *phba) | |||
3584 | uint32_t __iomem *resp_buf; | 3588 | uint32_t __iomem *resp_buf; |
3585 | uint32_t __iomem *mbox_buf; | 3589 | uint32_t __iomem *mbox_buf; |
3586 | volatile uint32_t mbox; | 3590 | volatile uint32_t mbox; |
3587 | uint32_t hc_copy; | 3591 | uint32_t hc_copy, ha_copy, resp_data; |
3588 | int i; | 3592 | int i; |
3589 | uint8_t hdrtype; | 3593 | uint8_t hdrtype; |
3590 | 3594 | ||
@@ -3601,12 +3605,15 @@ void lpfc_reset_barrier(struct lpfc_hba *phba) | |||
3601 | resp_buf = phba->MBslimaddr; | 3605 | resp_buf = phba->MBslimaddr; |
3602 | 3606 | ||
3603 | /* Disable the error attention */ | 3607 | /* Disable the error attention */ |
3604 | hc_copy = readl(phba->HCregaddr); | 3608 | if (lpfc_readl(phba->HCregaddr, &hc_copy)) |
3609 | return; | ||
3605 | writel((hc_copy & ~HC_ERINT_ENA), phba->HCregaddr); | 3610 | writel((hc_copy & ~HC_ERINT_ENA), phba->HCregaddr); |
3606 | readl(phba->HCregaddr); /* flush */ | 3611 | readl(phba->HCregaddr); /* flush */ |
3607 | phba->link_flag |= LS_IGNORE_ERATT; | 3612 | phba->link_flag |= LS_IGNORE_ERATT; |
3608 | 3613 | ||
3609 | if (readl(phba->HAregaddr) & HA_ERATT) { | 3614 | if (lpfc_readl(phba->HAregaddr, &ha_copy)) |
3615 | return; | ||
3616 | if (ha_copy & HA_ERATT) { | ||
3610 | /* Clear Chip error bit */ | 3617 | /* Clear Chip error bit */ |
3611 | writel(HA_ERATT, phba->HAregaddr); | 3618 | writel(HA_ERATT, phba->HAregaddr); |
3612 | phba->pport->stopped = 1; | 3619 | phba->pport->stopped = 1; |
@@ -3620,11 +3627,18 @@ void lpfc_reset_barrier(struct lpfc_hba *phba) | |||
3620 | mbox_buf = phba->MBslimaddr; | 3627 | mbox_buf = phba->MBslimaddr; |
3621 | writel(mbox, mbox_buf); | 3628 | writel(mbox, mbox_buf); |
3622 | 3629 | ||
3623 | for (i = 0; | 3630 | for (i = 0; i < 50; i++) { |
3624 | readl(resp_buf + 1) != ~(BARRIER_TEST_PATTERN) && i < 50; i++) | 3631 | if (lpfc_readl((resp_buf + 1), &resp_data)) |
3625 | mdelay(1); | 3632 | return; |
3626 | 3633 | if (resp_data != ~(BARRIER_TEST_PATTERN)) | |
3627 | if (readl(resp_buf + 1) != ~(BARRIER_TEST_PATTERN)) { | 3634 | mdelay(1); |
3635 | else | ||
3636 | break; | ||
3637 | } | ||
3638 | resp_data = 0; | ||
3639 | if (lpfc_readl((resp_buf + 1), &resp_data)) | ||
3640 | return; | ||
3641 | if (resp_data != ~(BARRIER_TEST_PATTERN)) { | ||
3628 | if (phba->sli.sli_flag & LPFC_SLI_ACTIVE || | 3642 | if (phba->sli.sli_flag & LPFC_SLI_ACTIVE || |
3629 | phba->pport->stopped) | 3643 | phba->pport->stopped) |
3630 | goto restore_hc; | 3644 | goto restore_hc; |
@@ -3633,13 +3647,26 @@ void lpfc_reset_barrier(struct lpfc_hba *phba) | |||
3633 | } | 3647 | } |
3634 | 3648 | ||
3635 | ((MAILBOX_t *)&mbox)->mbxOwner = OWN_HOST; | 3649 | ((MAILBOX_t *)&mbox)->mbxOwner = OWN_HOST; |
3636 | for (i = 0; readl(resp_buf) != mbox && i < 500; i++) | 3650 | resp_data = 0; |
3637 | mdelay(1); | 3651 | for (i = 0; i < 500; i++) { |
3652 | if (lpfc_readl(resp_buf, &resp_data)) | ||
3653 | return; | ||
3654 | if (resp_data != mbox) | ||
3655 | mdelay(1); | ||
3656 | else | ||
3657 | break; | ||
3658 | } | ||
3638 | 3659 | ||
3639 | clear_errat: | 3660 | clear_errat: |
3640 | 3661 | ||
3641 | while (!(readl(phba->HAregaddr) & HA_ERATT) && ++i < 500) | 3662 | while (++i < 500) { |
3642 | mdelay(1); | 3663 | if (lpfc_readl(phba->HAregaddr, &ha_copy)) |
3664 | return; | ||
3665 | if (!(ha_copy & HA_ERATT)) | ||
3666 | mdelay(1); | ||
3667 | else | ||
3668 | break; | ||
3669 | } | ||
3643 | 3670 | ||
3644 | if (readl(phba->HAregaddr) & HA_ERATT) { | 3671 | if (readl(phba->HAregaddr) & HA_ERATT) { |
3645 | writel(HA_ERATT, phba->HAregaddr); | 3672 | writel(HA_ERATT, phba->HAregaddr); |
@@ -3686,7 +3713,11 @@ lpfc_sli_brdkill(struct lpfc_hba *phba) | |||
3686 | 3713 | ||
3687 | /* Disable the error attention */ | 3714 | /* Disable the error attention */ |
3688 | spin_lock_irq(&phba->hbalock); | 3715 | spin_lock_irq(&phba->hbalock); |
3689 | status = readl(phba->HCregaddr); | 3716 | if (lpfc_readl(phba->HCregaddr, &status)) { |
3717 | spin_unlock_irq(&phba->hbalock); | ||
3718 | mempool_free(pmb, phba->mbox_mem_pool); | ||
3719 | return 1; | ||
3720 | } | ||
3690 | status &= ~HC_ERINT_ENA; | 3721 | status &= ~HC_ERINT_ENA; |
3691 | writel(status, phba->HCregaddr); | 3722 | writel(status, phba->HCregaddr); |
3692 | readl(phba->HCregaddr); /* flush */ | 3723 | readl(phba->HCregaddr); /* flush */ |
@@ -3720,11 +3751,12 @@ lpfc_sli_brdkill(struct lpfc_hba *phba) | |||
3720 | * 3 seconds we still set HBA_ERROR state because the status of the | 3751 | * 3 seconds we still set HBA_ERROR state because the status of the |
3721 | * board is now undefined. | 3752 | * board is now undefined. |
3722 | */ | 3753 | */ |
3723 | ha_copy = readl(phba->HAregaddr); | 3754 | if (lpfc_readl(phba->HAregaddr, &ha_copy)) |
3724 | 3755 | return 1; | |
3725 | while ((i++ < 30) && !(ha_copy & HA_ERATT)) { | 3756 | while ((i++ < 30) && !(ha_copy & HA_ERATT)) { |
3726 | mdelay(100); | 3757 | mdelay(100); |
3727 | ha_copy = readl(phba->HAregaddr); | 3758 | if (lpfc_readl(phba->HAregaddr, &ha_copy)) |
3759 | return 1; | ||
3728 | } | 3760 | } |
3729 | 3761 | ||
3730 | del_timer_sync(&psli->mbox_tmo); | 3762 | del_timer_sync(&psli->mbox_tmo); |
@@ -4018,7 +4050,8 @@ lpfc_sli_chipset_init(struct lpfc_hba *phba) | |||
4018 | uint32_t status, i = 0; | 4050 | uint32_t status, i = 0; |
4019 | 4051 | ||
4020 | /* Read the HBA Host Status Register */ | 4052 | /* Read the HBA Host Status Register */ |
4021 | status = readl(phba->HSregaddr); | 4053 | if (lpfc_readl(phba->HSregaddr, &status)) |
4054 | return -EIO; | ||
4022 | 4055 | ||
4023 | /* Check status register to see what current state is */ | 4056 | /* Check status register to see what current state is */ |
4024 | i = 0; | 4057 | i = 0; |
@@ -4073,7 +4106,8 @@ lpfc_sli_chipset_init(struct lpfc_hba *phba) | |||
4073 | lpfc_sli_brdrestart(phba); | 4106 | lpfc_sli_brdrestart(phba); |
4074 | } | 4107 | } |
4075 | /* Read the HBA Host Status Register */ | 4108 | /* Read the HBA Host Status Register */ |
4076 | status = readl(phba->HSregaddr); | 4109 | if (lpfc_readl(phba->HSregaddr, &status)) |
4110 | return -EIO; | ||
4077 | } | 4111 | } |
4078 | 4112 | ||
4079 | /* Check to see if any errors occurred during init */ | 4113 | /* Check to see if any errors occurred during init */ |
@@ -5083,7 +5117,7 @@ lpfc_mbox_timeout_handler(struct lpfc_hba *phba) | |||
5083 | 5117 | ||
5084 | /* Setting state unknown so lpfc_sli_abort_iocb_ring | 5118 | /* Setting state unknown so lpfc_sli_abort_iocb_ring |
5085 | * would get IOCB_ERROR from lpfc_sli_issue_iocb, allowing | 5119 | * would get IOCB_ERROR from lpfc_sli_issue_iocb, allowing |
5086 | * it to fail all oustanding SCSI IO. | 5120 | * it to fail all outstanding SCSI IO. |
5087 | */ | 5121 | */ |
5088 | spin_lock_irq(&phba->pport->work_port_lock); | 5122 | spin_lock_irq(&phba->pport->work_port_lock); |
5089 | phba->pport->work_port_events &= ~WORKER_MBOX_TMO; | 5123 | phba->pport->work_port_events &= ~WORKER_MBOX_TMO; |
@@ -5136,7 +5170,7 @@ lpfc_sli_issue_mbox_s3(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, | |||
5136 | MAILBOX_t *mb; | 5170 | MAILBOX_t *mb; |
5137 | struct lpfc_sli *psli = &phba->sli; | 5171 | struct lpfc_sli *psli = &phba->sli; |
5138 | uint32_t status, evtctr; | 5172 | uint32_t status, evtctr; |
5139 | uint32_t ha_copy; | 5173 | uint32_t ha_copy, hc_copy; |
5140 | int i; | 5174 | int i; |
5141 | unsigned long timeout; | 5175 | unsigned long timeout; |
5142 | unsigned long drvr_flag = 0; | 5176 | unsigned long drvr_flag = 0; |
@@ -5202,15 +5236,17 @@ lpfc_sli_issue_mbox_s3(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, | |||
5202 | goto out_not_finished; | 5236 | goto out_not_finished; |
5203 | } | 5237 | } |
5204 | 5238 | ||
5205 | if (mb->mbxCommand != MBX_KILL_BOARD && flag & MBX_NOWAIT && | 5239 | if (mb->mbxCommand != MBX_KILL_BOARD && flag & MBX_NOWAIT) { |
5206 | !(readl(phba->HCregaddr) & HC_MBINT_ENA)) { | 5240 | if (lpfc_readl(phba->HCregaddr, &hc_copy) || |
5207 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); | 5241 | !(hc_copy & HC_MBINT_ENA)) { |
5208 | lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI, | 5242 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); |
5243 | lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI, | ||
5209 | "(%d):2528 Mailbox command x%x cannot " | 5244 | "(%d):2528 Mailbox command x%x cannot " |
5210 | "issue Data: x%x x%x\n", | 5245 | "issue Data: x%x x%x\n", |
5211 | pmbox->vport ? pmbox->vport->vpi : 0, | 5246 | pmbox->vport ? pmbox->vport->vpi : 0, |
5212 | pmbox->u.mb.mbxCommand, psli->sli_flag, flag); | 5247 | pmbox->u.mb.mbxCommand, psli->sli_flag, flag); |
5213 | goto out_not_finished; | 5248 | goto out_not_finished; |
5249 | } | ||
5214 | } | 5250 | } |
5215 | 5251 | ||
5216 | if (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE) { | 5252 | if (psli->sli_flag & LPFC_SLI_MBOX_ACTIVE) { |
@@ -5408,11 +5444,19 @@ lpfc_sli_issue_mbox_s3(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, | |||
5408 | word0 = le32_to_cpu(word0); | 5444 | word0 = le32_to_cpu(word0); |
5409 | } else { | 5445 | } else { |
5410 | /* First read mbox status word */ | 5446 | /* First read mbox status word */ |
5411 | word0 = readl(phba->MBslimaddr); | 5447 | if (lpfc_readl(phba->MBslimaddr, &word0)) { |
5448 | spin_unlock_irqrestore(&phba->hbalock, | ||
5449 | drvr_flag); | ||
5450 | goto out_not_finished; | ||
5451 | } | ||
5412 | } | 5452 | } |
5413 | 5453 | ||
5414 | /* Read the HBA Host Attention Register */ | 5454 | /* Read the HBA Host Attention Register */ |
5415 | ha_copy = readl(phba->HAregaddr); | 5455 | if (lpfc_readl(phba->HAregaddr, &ha_copy)) { |
5456 | spin_unlock_irqrestore(&phba->hbalock, | ||
5457 | drvr_flag); | ||
5458 | goto out_not_finished; | ||
5459 | } | ||
5416 | timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, | 5460 | timeout = msecs_to_jiffies(lpfc_mbox_tmo_val(phba, |
5417 | mb->mbxCommand) * | 5461 | mb->mbxCommand) * |
5418 | 1000) + jiffies; | 5462 | 1000) + jiffies; |
@@ -5463,7 +5507,11 @@ lpfc_sli_issue_mbox_s3(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, | |||
5463 | word0 = readl(phba->MBslimaddr); | 5507 | word0 = readl(phba->MBslimaddr); |
5464 | } | 5508 | } |
5465 | /* Read the HBA Host Attention Register */ | 5509 | /* Read the HBA Host Attention Register */ |
5466 | ha_copy = readl(phba->HAregaddr); | 5510 | if (lpfc_readl(phba->HAregaddr, &ha_copy)) { |
5511 | spin_unlock_irqrestore(&phba->hbalock, | ||
5512 | drvr_flag); | ||
5513 | goto out_not_finished; | ||
5514 | } | ||
5467 | } | 5515 | } |
5468 | 5516 | ||
5469 | if (psli->sli_flag & LPFC_SLI_ACTIVE) { | 5517 | if (psli->sli_flag & LPFC_SLI_ACTIVE) { |
@@ -5983,7 +6031,7 @@ lpfc_sli_issue_mbox(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmbox, uint32_t flag) | |||
5983 | } | 6031 | } |
5984 | 6032 | ||
5985 | /** | 6033 | /** |
5986 | * lpfc_mbox_api_table_setup - Set up mbox api fucntion jump table | 6034 | * lpfc_mbox_api_table_setup - Set up mbox api function jump table |
5987 | * @phba: The hba struct for which this call is being executed. | 6035 | * @phba: The hba struct for which this call is being executed. |
5988 | * @dev_grp: The HBA PCI-Device group number. | 6036 | * @dev_grp: The HBA PCI-Device group number. |
5989 | * | 6037 | * |
@@ -6263,7 +6311,6 @@ lpfc_sli4_bpl2sgl(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq, | |||
6263 | bf_set(lpfc_sli4_sge_last, sgl, 1); | 6311 | bf_set(lpfc_sli4_sge_last, sgl, 1); |
6264 | else | 6312 | else |
6265 | bf_set(lpfc_sli4_sge_last, sgl, 0); | 6313 | bf_set(lpfc_sli4_sge_last, sgl, 0); |
6266 | sgl->word2 = cpu_to_le32(sgl->word2); | ||
6267 | /* swap the size field back to the cpu so we | 6314 | /* swap the size field back to the cpu so we |
6268 | * can assign it to the sgl. | 6315 | * can assign it to the sgl. |
6269 | */ | 6316 | */ |
@@ -6283,6 +6330,7 @@ lpfc_sli4_bpl2sgl(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq, | |||
6283 | bf_set(lpfc_sli4_sge_offset, sgl, offset); | 6330 | bf_set(lpfc_sli4_sge_offset, sgl, offset); |
6284 | offset += bde.tus.f.bdeSize; | 6331 | offset += bde.tus.f.bdeSize; |
6285 | } | 6332 | } |
6333 | sgl->word2 = cpu_to_le32(sgl->word2); | ||
6286 | bpl++; | 6334 | bpl++; |
6287 | sgl++; | 6335 | sgl++; |
6288 | } | 6336 | } |
@@ -6528,9 +6576,9 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq, | |||
6528 | numBdes = iocbq->iocb.un.genreq64.bdl.bdeSize / | 6576 | numBdes = iocbq->iocb.un.genreq64.bdl.bdeSize / |
6529 | sizeof(struct ulp_bde64); | 6577 | sizeof(struct ulp_bde64); |
6530 | for (i = 0; i < numBdes; i++) { | 6578 | for (i = 0; i < numBdes; i++) { |
6531 | if (bpl[i].tus.f.bdeFlags != BUFF_TYPE_BDE_64) | ||
6532 | break; | ||
6533 | bde.tus.w = le32_to_cpu(bpl[i].tus.w); | 6579 | bde.tus.w = le32_to_cpu(bpl[i].tus.w); |
6580 | if (bde.tus.f.bdeFlags != BUFF_TYPE_BDE_64) | ||
6581 | break; | ||
6534 | xmit_len += bde.tus.f.bdeSize; | 6582 | xmit_len += bde.tus.f.bdeSize; |
6535 | } | 6583 | } |
6536 | /* word3 iocb=IO_TAG wqe=request_payload_len */ | 6584 | /* word3 iocb=IO_TAG wqe=request_payload_len */ |
@@ -6620,15 +6668,15 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq, | |||
6620 | xritag = 0; | 6668 | xritag = 0; |
6621 | break; | 6669 | break; |
6622 | case CMD_XMIT_BLS_RSP64_CX: | 6670 | case CMD_XMIT_BLS_RSP64_CX: |
6623 | /* As BLS ABTS-ACC WQE is very different from other WQEs, | 6671 | /* As BLS ABTS RSP WQE is very different from other WQEs, |
6624 | * we re-construct this WQE here based on information in | 6672 | * we re-construct this WQE here based on information in |
6625 | * iocbq from scratch. | 6673 | * iocbq from scratch. |
6626 | */ | 6674 | */ |
6627 | memset(wqe, 0, sizeof(union lpfc_wqe)); | 6675 | memset(wqe, 0, sizeof(union lpfc_wqe)); |
6628 | /* OX_ID is invariable to who sent ABTS to CT exchange */ | 6676 | /* OX_ID is invariable to who sent ABTS to CT exchange */ |
6629 | bf_set(xmit_bls_rsp64_oxid, &wqe->xmit_bls_rsp, | 6677 | bf_set(xmit_bls_rsp64_oxid, &wqe->xmit_bls_rsp, |
6630 | bf_get(lpfc_abts_oxid, &iocbq->iocb.un.bls_acc)); | 6678 | bf_get(lpfc_abts_oxid, &iocbq->iocb.un.bls_rsp)); |
6631 | if (bf_get(lpfc_abts_orig, &iocbq->iocb.un.bls_acc) == | 6679 | if (bf_get(lpfc_abts_orig, &iocbq->iocb.un.bls_rsp) == |
6632 | LPFC_ABTS_UNSOL_INT) { | 6680 | LPFC_ABTS_UNSOL_INT) { |
6633 | /* ABTS sent by initiator to CT exchange, the | 6681 | /* ABTS sent by initiator to CT exchange, the |
6634 | * RX_ID field will be filled with the newly | 6682 | * RX_ID field will be filled with the newly |
@@ -6642,7 +6690,7 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq, | |||
6642 | * RX_ID from ABTS. | 6690 | * RX_ID from ABTS. |
6643 | */ | 6691 | */ |
6644 | bf_set(xmit_bls_rsp64_rxid, &wqe->xmit_bls_rsp, | 6692 | bf_set(xmit_bls_rsp64_rxid, &wqe->xmit_bls_rsp, |
6645 | bf_get(lpfc_abts_rxid, &iocbq->iocb.un.bls_acc)); | 6693 | bf_get(lpfc_abts_rxid, &iocbq->iocb.un.bls_rsp)); |
6646 | } | 6694 | } |
6647 | bf_set(xmit_bls_rsp64_seqcnthi, &wqe->xmit_bls_rsp, 0xffff); | 6695 | bf_set(xmit_bls_rsp64_seqcnthi, &wqe->xmit_bls_rsp, 0xffff); |
6648 | bf_set(wqe_xmit_bls_pt, &wqe->xmit_bls_rsp.wqe_dest, 0x1); | 6696 | bf_set(wqe_xmit_bls_pt, &wqe->xmit_bls_rsp.wqe_dest, 0x1); |
@@ -6653,6 +6701,15 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq, | |||
6653 | LPFC_WQE_LENLOC_NONE); | 6701 | LPFC_WQE_LENLOC_NONE); |
6654 | /* Overwrite the pre-set comnd type with OTHER_COMMAND */ | 6702 | /* Overwrite the pre-set comnd type with OTHER_COMMAND */ |
6655 | command_type = OTHER_COMMAND; | 6703 | command_type = OTHER_COMMAND; |
6704 | if (iocbq->iocb.un.xseq64.w5.hcsw.Rctl == FC_RCTL_BA_RJT) { | ||
6705 | bf_set(xmit_bls_rsp64_rjt_vspec, &wqe->xmit_bls_rsp, | ||
6706 | bf_get(lpfc_vndr_code, &iocbq->iocb.un.bls_rsp)); | ||
6707 | bf_set(xmit_bls_rsp64_rjt_expc, &wqe->xmit_bls_rsp, | ||
6708 | bf_get(lpfc_rsn_expln, &iocbq->iocb.un.bls_rsp)); | ||
6709 | bf_set(xmit_bls_rsp64_rjt_rsnc, &wqe->xmit_bls_rsp, | ||
6710 | bf_get(lpfc_rsn_code, &iocbq->iocb.un.bls_rsp)); | ||
6711 | } | ||
6712 | |||
6656 | break; | 6713 | break; |
6657 | case CMD_XRI_ABORTED_CX: | 6714 | case CMD_XRI_ABORTED_CX: |
6658 | case CMD_CREATE_XRI_CR: /* Do we expect to use this? */ | 6715 | case CMD_CREATE_XRI_CR: /* Do we expect to use this? */ |
@@ -6701,7 +6758,8 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t ring_number, | |||
6701 | 6758 | ||
6702 | if (piocb->sli4_xritag == NO_XRI) { | 6759 | if (piocb->sli4_xritag == NO_XRI) { |
6703 | if (piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN || | 6760 | if (piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN || |
6704 | piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN) | 6761 | piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN || |
6762 | piocb->iocb.ulpCommand == CMD_XMIT_BLS_RSP64_CX) | ||
6705 | sglq = NULL; | 6763 | sglq = NULL; |
6706 | else { | 6764 | else { |
6707 | if (pring->txq_cnt) { | 6765 | if (pring->txq_cnt) { |
@@ -6789,7 +6847,7 @@ __lpfc_sli_issue_iocb(struct lpfc_hba *phba, uint32_t ring_number, | |||
6789 | } | 6847 | } |
6790 | 6848 | ||
6791 | /** | 6849 | /** |
6792 | * lpfc_sli_api_table_setup - Set up sli api fucntion jump table | 6850 | * lpfc_sli_api_table_setup - Set up sli api function jump table |
6793 | * @phba: The hba struct for which this call is being executed. | 6851 | * @phba: The hba struct for which this call is being executed. |
6794 | * @dev_grp: The HBA PCI-Device group number. | 6852 | * @dev_grp: The HBA PCI-Device group number. |
6795 | * | 6853 | * |
@@ -7463,7 +7521,7 @@ lpfc_sli_ring_taggedbuf_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
7463 | struct lpfc_dmabuf *mp, *next_mp; | 7521 | struct lpfc_dmabuf *mp, *next_mp; |
7464 | struct list_head *slp = &pring->postbufq; | 7522 | struct list_head *slp = &pring->postbufq; |
7465 | 7523 | ||
7466 | /* Search postbufq, from the begining, looking for a match on tag */ | 7524 | /* Search postbufq, from the beginning, looking for a match on tag */ |
7467 | spin_lock_irq(&phba->hbalock); | 7525 | spin_lock_irq(&phba->hbalock); |
7468 | list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) { | 7526 | list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) { |
7469 | if (mp->buffer_tag == tag) { | 7527 | if (mp->buffer_tag == tag) { |
@@ -7507,7 +7565,7 @@ lpfc_sli_ringpostbuf_get(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, | |||
7507 | struct lpfc_dmabuf *mp, *next_mp; | 7565 | struct lpfc_dmabuf *mp, *next_mp; |
7508 | struct list_head *slp = &pring->postbufq; | 7566 | struct list_head *slp = &pring->postbufq; |
7509 | 7567 | ||
7510 | /* Search postbufq, from the begining, looking for a match on phys */ | 7568 | /* Search postbufq, from the beginning, looking for a match on phys */ |
7511 | spin_lock_irq(&phba->hbalock); | 7569 | spin_lock_irq(&phba->hbalock); |
7512 | list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) { | 7570 | list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) { |
7513 | if (mp->phys == phys) { | 7571 | if (mp->phys == phys) { |
@@ -8194,7 +8252,8 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba *phba, | |||
8194 | piocb->iocb_flag &= ~LPFC_IO_WAKE; | 8252 | piocb->iocb_flag &= ~LPFC_IO_WAKE; |
8195 | 8253 | ||
8196 | if (phba->cfg_poll & DISABLE_FCP_RING_INT) { | 8254 | if (phba->cfg_poll & DISABLE_FCP_RING_INT) { |
8197 | creg_val = readl(phba->HCregaddr); | 8255 | if (lpfc_readl(phba->HCregaddr, &creg_val)) |
8256 | return IOCB_ERROR; | ||
8198 | creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); | 8257 | creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); |
8199 | writel(creg_val, phba->HCregaddr); | 8258 | writel(creg_val, phba->HCregaddr); |
8200 | readl(phba->HCregaddr); /* flush */ | 8259 | readl(phba->HCregaddr); /* flush */ |
@@ -8236,7 +8295,8 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba *phba, | |||
8236 | } | 8295 | } |
8237 | 8296 | ||
8238 | if (phba->cfg_poll & DISABLE_FCP_RING_INT) { | 8297 | if (phba->cfg_poll & DISABLE_FCP_RING_INT) { |
8239 | creg_val = readl(phba->HCregaddr); | 8298 | if (lpfc_readl(phba->HCregaddr, &creg_val)) |
8299 | return IOCB_ERROR; | ||
8240 | creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING); | 8300 | creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING); |
8241 | writel(creg_val, phba->HCregaddr); | 8301 | writel(creg_val, phba->HCregaddr); |
8242 | readl(phba->HCregaddr); /* flush */ | 8302 | readl(phba->HCregaddr); /* flush */ |
@@ -8378,7 +8438,7 @@ lpfc_sli_mbox_sys_shutdown(struct lpfc_hba *phba) | |||
8378 | * for possible error attention events. The caller must hold the hostlock | 8438 | * for possible error attention events. The caller must hold the hostlock |
8379 | * with spin_lock_irq(). | 8439 | * with spin_lock_irq(). |
8380 | * | 8440 | * |
8381 | * This fucntion returns 1 when there is Error Attention in the Host Attention | 8441 | * This function returns 1 when there is Error Attention in the Host Attention |
8382 | * Register and returns 0 otherwise. | 8442 | * Register and returns 0 otherwise. |
8383 | **/ | 8443 | **/ |
8384 | static int | 8444 | static int |
@@ -8387,10 +8447,13 @@ lpfc_sli_eratt_read(struct lpfc_hba *phba) | |||
8387 | uint32_t ha_copy; | 8447 | uint32_t ha_copy; |
8388 | 8448 | ||
8389 | /* Read chip Host Attention (HA) register */ | 8449 | /* Read chip Host Attention (HA) register */ |
8390 | ha_copy = readl(phba->HAregaddr); | 8450 | if (lpfc_readl(phba->HAregaddr, &ha_copy)) |
8451 | goto unplug_err; | ||
8452 | |||
8391 | if (ha_copy & HA_ERATT) { | 8453 | if (ha_copy & HA_ERATT) { |
8392 | /* Read host status register to retrieve error event */ | 8454 | /* Read host status register to retrieve error event */ |
8393 | lpfc_sli_read_hs(phba); | 8455 | if (lpfc_sli_read_hs(phba)) |
8456 | goto unplug_err; | ||
8394 | 8457 | ||
8395 | /* Check if there is a deferred error condition is active */ | 8458 | /* Check if there is a deferred error condition is active */ |
8396 | if ((HS_FFER1 & phba->work_hs) && | 8459 | if ((HS_FFER1 & phba->work_hs) && |
@@ -8409,6 +8472,15 @@ lpfc_sli_eratt_read(struct lpfc_hba *phba) | |||
8409 | return 1; | 8472 | return 1; |
8410 | } | 8473 | } |
8411 | return 0; | 8474 | return 0; |
8475 | |||
8476 | unplug_err: | ||
8477 | /* Set the driver HS work bitmap */ | ||
8478 | phba->work_hs |= UNPLUG_ERR; | ||
8479 | /* Set the driver HA work bitmap */ | ||
8480 | phba->work_ha |= HA_ERATT; | ||
8481 | /* Indicate polling handles this ERATT */ | ||
8482 | phba->hba_flag |= HBA_ERATT_HANDLED; | ||
8483 | return 1; | ||
8412 | } | 8484 | } |
8413 | 8485 | ||
8414 | /** | 8486 | /** |
@@ -8419,7 +8491,7 @@ lpfc_sli_eratt_read(struct lpfc_hba *phba) | |||
8419 | * for possible error attention events. The caller must hold the hostlock | 8491 | * for possible error attention events. The caller must hold the hostlock |
8420 | * with spin_lock_irq(). | 8492 | * with spin_lock_irq(). |
8421 | * | 8493 | * |
8422 | * This fucntion returns 1 when there is Error Attention in the Host Attention | 8494 | * This function returns 1 when there is Error Attention in the Host Attention |
8423 | * Register and returns 0 otherwise. | 8495 | * Register and returns 0 otherwise. |
8424 | **/ | 8496 | **/ |
8425 | static int | 8497 | static int |
@@ -8436,8 +8508,15 @@ lpfc_sli4_eratt_read(struct lpfc_hba *phba) | |||
8436 | if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); | 8508 | if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); |
8437 | switch (if_type) { | 8509 | switch (if_type) { |
8438 | case LPFC_SLI_INTF_IF_TYPE_0: | 8510 | case LPFC_SLI_INTF_IF_TYPE_0: |
8439 | uerr_sta_lo = readl(phba->sli4_hba.u.if_type0.UERRLOregaddr); | 8511 | if (lpfc_readl(phba->sli4_hba.u.if_type0.UERRLOregaddr, |
8440 | uerr_sta_hi = readl(phba->sli4_hba.u.if_type0.UERRHIregaddr); | 8512 | &uerr_sta_lo) || |
8513 | lpfc_readl(phba->sli4_hba.u.if_type0.UERRHIregaddr, | ||
8514 | &uerr_sta_hi)) { | ||
8515 | phba->work_hs |= UNPLUG_ERR; | ||
8516 | phba->work_ha |= HA_ERATT; | ||
8517 | phba->hba_flag |= HBA_ERATT_HANDLED; | ||
8518 | return 1; | ||
8519 | } | ||
8441 | if ((~phba->sli4_hba.ue_mask_lo & uerr_sta_lo) || | 8520 | if ((~phba->sli4_hba.ue_mask_lo & uerr_sta_lo) || |
8442 | (~phba->sli4_hba.ue_mask_hi & uerr_sta_hi)) { | 8521 | (~phba->sli4_hba.ue_mask_hi & uerr_sta_hi)) { |
8443 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 8522 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
@@ -8456,9 +8535,15 @@ lpfc_sli4_eratt_read(struct lpfc_hba *phba) | |||
8456 | } | 8535 | } |
8457 | break; | 8536 | break; |
8458 | case LPFC_SLI_INTF_IF_TYPE_2: | 8537 | case LPFC_SLI_INTF_IF_TYPE_2: |
8459 | portstat_reg.word0 = | 8538 | if (lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr, |
8460 | readl(phba->sli4_hba.u.if_type2.STATUSregaddr); | 8539 | &portstat_reg.word0) || |
8461 | portsmphr = readl(phba->sli4_hba.PSMPHRregaddr); | 8540 | lpfc_readl(phba->sli4_hba.PSMPHRregaddr, |
8541 | &portsmphr)){ | ||
8542 | phba->work_hs |= UNPLUG_ERR; | ||
8543 | phba->work_ha |= HA_ERATT; | ||
8544 | phba->hba_flag |= HBA_ERATT_HANDLED; | ||
8545 | return 1; | ||
8546 | } | ||
8462 | if (bf_get(lpfc_sliport_status_err, &portstat_reg)) { | 8547 | if (bf_get(lpfc_sliport_status_err, &portstat_reg)) { |
8463 | phba->work_status[0] = | 8548 | phba->work_status[0] = |
8464 | readl(phba->sli4_hba.u.if_type2.ERR1regaddr); | 8549 | readl(phba->sli4_hba.u.if_type2.ERR1regaddr); |
@@ -8496,7 +8581,7 @@ lpfc_sli4_eratt_read(struct lpfc_hba *phba) | |||
8496 | * This function is called from timer soft interrupt context to check HBA's | 8581 | * This function is called from timer soft interrupt context to check HBA's |
8497 | * error attention register bit for error attention events. | 8582 | * error attention register bit for error attention events. |
8498 | * | 8583 | * |
8499 | * This fucntion returns 1 when there is Error Attention in the Host Attention | 8584 | * This function returns 1 when there is Error Attention in the Host Attention |
8500 | * Register and returns 0 otherwise. | 8585 | * Register and returns 0 otherwise. |
8501 | **/ | 8586 | **/ |
8502 | int | 8587 | int |
@@ -8639,7 +8724,8 @@ lpfc_sli_sp_intr_handler(int irq, void *dev_id) | |||
8639 | return IRQ_NONE; | 8724 | return IRQ_NONE; |
8640 | /* Need to read HA REG for slow-path events */ | 8725 | /* Need to read HA REG for slow-path events */ |
8641 | spin_lock_irqsave(&phba->hbalock, iflag); | 8726 | spin_lock_irqsave(&phba->hbalock, iflag); |
8642 | ha_copy = readl(phba->HAregaddr); | 8727 | if (lpfc_readl(phba->HAregaddr, &ha_copy)) |
8728 | goto unplug_error; | ||
8643 | /* If somebody is waiting to handle an eratt don't process it | 8729 | /* If somebody is waiting to handle an eratt don't process it |
8644 | * here. The brdkill function will do this. | 8730 | * here. The brdkill function will do this. |
8645 | */ | 8731 | */ |
@@ -8665,7 +8751,9 @@ lpfc_sli_sp_intr_handler(int irq, void *dev_id) | |||
8665 | } | 8751 | } |
8666 | 8752 | ||
8667 | /* Clear up only attention source related to slow-path */ | 8753 | /* Clear up only attention source related to slow-path */ |
8668 | hc_copy = readl(phba->HCregaddr); | 8754 | if (lpfc_readl(phba->HCregaddr, &hc_copy)) |
8755 | goto unplug_error; | ||
8756 | |||
8669 | writel(hc_copy & ~(HC_MBINT_ENA | HC_R2INT_ENA | | 8757 | writel(hc_copy & ~(HC_MBINT_ENA | HC_R2INT_ENA | |
8670 | HC_LAINT_ENA | HC_ERINT_ENA), | 8758 | HC_LAINT_ENA | HC_ERINT_ENA), |
8671 | phba->HCregaddr); | 8759 | phba->HCregaddr); |
@@ -8688,7 +8776,8 @@ lpfc_sli_sp_intr_handler(int irq, void *dev_id) | |||
8688 | */ | 8776 | */ |
8689 | spin_lock_irqsave(&phba->hbalock, iflag); | 8777 | spin_lock_irqsave(&phba->hbalock, iflag); |
8690 | phba->sli.sli_flag &= ~LPFC_PROCESS_LA; | 8778 | phba->sli.sli_flag &= ~LPFC_PROCESS_LA; |
8691 | control = readl(phba->HCregaddr); | 8779 | if (lpfc_readl(phba->HCregaddr, &control)) |
8780 | goto unplug_error; | ||
8692 | control &= ~HC_LAINT_ENA; | 8781 | control &= ~HC_LAINT_ENA; |
8693 | writel(control, phba->HCregaddr); | 8782 | writel(control, phba->HCregaddr); |
8694 | readl(phba->HCregaddr); /* flush */ | 8783 | readl(phba->HCregaddr); /* flush */ |
@@ -8708,7 +8797,8 @@ lpfc_sli_sp_intr_handler(int irq, void *dev_id) | |||
8708 | status >>= (4*LPFC_ELS_RING); | 8797 | status >>= (4*LPFC_ELS_RING); |
8709 | if (status & HA_RXMASK) { | 8798 | if (status & HA_RXMASK) { |
8710 | spin_lock_irqsave(&phba->hbalock, iflag); | 8799 | spin_lock_irqsave(&phba->hbalock, iflag); |
8711 | control = readl(phba->HCregaddr); | 8800 | if (lpfc_readl(phba->HCregaddr, &control)) |
8801 | goto unplug_error; | ||
8712 | 8802 | ||
8713 | lpfc_debugfs_slow_ring_trc(phba, | 8803 | lpfc_debugfs_slow_ring_trc(phba, |
8714 | "ISR slow ring: ctl:x%x stat:x%x isrcnt:x%x", | 8804 | "ISR slow ring: ctl:x%x stat:x%x isrcnt:x%x", |
@@ -8741,7 +8831,8 @@ lpfc_sli_sp_intr_handler(int irq, void *dev_id) | |||
8741 | } | 8831 | } |
8742 | spin_lock_irqsave(&phba->hbalock, iflag); | 8832 | spin_lock_irqsave(&phba->hbalock, iflag); |
8743 | if (work_ha_copy & HA_ERATT) { | 8833 | if (work_ha_copy & HA_ERATT) { |
8744 | lpfc_sli_read_hs(phba); | 8834 | if (lpfc_sli_read_hs(phba)) |
8835 | goto unplug_error; | ||
8745 | /* | 8836 | /* |
8746 | * Check if there is a deferred error condition | 8837 | * Check if there is a deferred error condition |
8747 | * is active | 8838 | * is active |
@@ -8872,6 +8963,9 @@ send_current_mbox: | |||
8872 | lpfc_worker_wake_up(phba); | 8963 | lpfc_worker_wake_up(phba); |
8873 | } | 8964 | } |
8874 | return IRQ_HANDLED; | 8965 | return IRQ_HANDLED; |
8966 | unplug_error: | ||
8967 | spin_unlock_irqrestore(&phba->hbalock, iflag); | ||
8968 | return IRQ_HANDLED; | ||
8875 | 8969 | ||
8876 | } /* lpfc_sli_sp_intr_handler */ | 8970 | } /* lpfc_sli_sp_intr_handler */ |
8877 | 8971 | ||
@@ -8919,7 +9013,8 @@ lpfc_sli_fp_intr_handler(int irq, void *dev_id) | |||
8919 | if (lpfc_intr_state_check(phba)) | 9013 | if (lpfc_intr_state_check(phba)) |
8920 | return IRQ_NONE; | 9014 | return IRQ_NONE; |
8921 | /* Need to read HA REG for FCP ring and other ring events */ | 9015 | /* Need to read HA REG for FCP ring and other ring events */ |
8922 | ha_copy = readl(phba->HAregaddr); | 9016 | if (lpfc_readl(phba->HAregaddr, &ha_copy)) |
9017 | return IRQ_HANDLED; | ||
8923 | /* Clear up only attention source related to fast-path */ | 9018 | /* Clear up only attention source related to fast-path */ |
8924 | spin_lock_irqsave(&phba->hbalock, iflag); | 9019 | spin_lock_irqsave(&phba->hbalock, iflag); |
8925 | /* | 9020 | /* |
@@ -9004,7 +9099,11 @@ lpfc_sli_intr_handler(int irq, void *dev_id) | |||
9004 | return IRQ_NONE; | 9099 | return IRQ_NONE; |
9005 | 9100 | ||
9006 | spin_lock(&phba->hbalock); | 9101 | spin_lock(&phba->hbalock); |
9007 | phba->ha_copy = readl(phba->HAregaddr); | 9102 | if (lpfc_readl(phba->HAregaddr, &phba->ha_copy)) { |
9103 | spin_unlock(&phba->hbalock); | ||
9104 | return IRQ_HANDLED; | ||
9105 | } | ||
9106 | |||
9008 | if (unlikely(!phba->ha_copy)) { | 9107 | if (unlikely(!phba->ha_copy)) { |
9009 | spin_unlock(&phba->hbalock); | 9108 | spin_unlock(&phba->hbalock); |
9010 | return IRQ_NONE; | 9109 | return IRQ_NONE; |
@@ -9026,7 +9125,10 @@ lpfc_sli_intr_handler(int irq, void *dev_id) | |||
9026 | } | 9125 | } |
9027 | 9126 | ||
9028 | /* Clear attention sources except link and error attentions */ | 9127 | /* Clear attention sources except link and error attentions */ |
9029 | hc_copy = readl(phba->HCregaddr); | 9128 | if (lpfc_readl(phba->HCregaddr, &hc_copy)) { |
9129 | spin_unlock(&phba->hbalock); | ||
9130 | return IRQ_HANDLED; | ||
9131 | } | ||
9030 | writel(hc_copy & ~(HC_MBINT_ENA | HC_R0INT_ENA | HC_R1INT_ENA | 9132 | writel(hc_copy & ~(HC_MBINT_ENA | HC_R0INT_ENA | HC_R1INT_ENA |
9031 | | HC_R2INT_ENA | HC_LAINT_ENA | HC_ERINT_ENA), | 9133 | | HC_R2INT_ENA | HC_LAINT_ENA | HC_ERINT_ENA), |
9032 | phba->HCregaddr); | 9134 | phba->HCregaddr); |
@@ -9582,7 +9684,7 @@ out: | |||
9582 | * @cq: Pointer to the completion queue. | 9684 | * @cq: Pointer to the completion queue. |
9583 | * @wcqe: Pointer to a completion queue entry. | 9685 | * @wcqe: Pointer to a completion queue entry. |
9584 | * | 9686 | * |
9585 | * This routine process a slow-path work-queue or recieve queue completion queue | 9687 | * This routine process a slow-path work-queue or receive queue completion queue |
9586 | * entry. | 9688 | * entry. |
9587 | * | 9689 | * |
9588 | * Return: true if work posted to worker thread, otherwise false. | 9690 | * Return: true if work posted to worker thread, otherwise false. |
@@ -10403,7 +10505,6 @@ lpfc_cq_create(struct lpfc_hba *phba, struct lpfc_queue *cq, | |||
10403 | if (!phba->sli4_hba.pc_sli4_params.supported) | 10505 | if (!phba->sli4_hba.pc_sli4_params.supported) |
10404 | hw_page_size = SLI4_PAGE_SIZE; | 10506 | hw_page_size = SLI4_PAGE_SIZE; |
10405 | 10507 | ||
10406 | |||
10407 | mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | 10508 | mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); |
10408 | if (!mbox) | 10509 | if (!mbox) |
10409 | return -ENOMEM; | 10510 | return -ENOMEM; |
@@ -10413,11 +10514,22 @@ lpfc_cq_create(struct lpfc_hba *phba, struct lpfc_queue *cq, | |||
10413 | LPFC_MBOX_OPCODE_CQ_CREATE, | 10514 | LPFC_MBOX_OPCODE_CQ_CREATE, |
10414 | length, LPFC_SLI4_MBX_EMBED); | 10515 | length, LPFC_SLI4_MBX_EMBED); |
10415 | cq_create = &mbox->u.mqe.un.cq_create; | 10516 | cq_create = &mbox->u.mqe.un.cq_create; |
10517 | shdr = (union lpfc_sli4_cfg_shdr *) &cq_create->header.cfg_shdr; | ||
10416 | bf_set(lpfc_mbx_cq_create_num_pages, &cq_create->u.request, | 10518 | bf_set(lpfc_mbx_cq_create_num_pages, &cq_create->u.request, |
10417 | cq->page_count); | 10519 | cq->page_count); |
10418 | bf_set(lpfc_cq_context_event, &cq_create->u.request.context, 1); | 10520 | bf_set(lpfc_cq_context_event, &cq_create->u.request.context, 1); |
10419 | bf_set(lpfc_cq_context_valid, &cq_create->u.request.context, 1); | 10521 | bf_set(lpfc_cq_context_valid, &cq_create->u.request.context, 1); |
10420 | bf_set(lpfc_cq_eq_id, &cq_create->u.request.context, eq->queue_id); | 10522 | bf_set(lpfc_mbox_hdr_version, &shdr->request, |
10523 | phba->sli4_hba.pc_sli4_params.cqv); | ||
10524 | if (phba->sli4_hba.pc_sli4_params.cqv == LPFC_Q_CREATE_VERSION_2) { | ||
10525 | bf_set(lpfc_mbx_cq_create_page_size, &cq_create->u.request, | ||
10526 | (PAGE_SIZE/SLI4_PAGE_SIZE)); | ||
10527 | bf_set(lpfc_cq_eq_id_2, &cq_create->u.request.context, | ||
10528 | eq->queue_id); | ||
10529 | } else { | ||
10530 | bf_set(lpfc_cq_eq_id, &cq_create->u.request.context, | ||
10531 | eq->queue_id); | ||
10532 | } | ||
10421 | switch (cq->entry_count) { | 10533 | switch (cq->entry_count) { |
10422 | default: | 10534 | default: |
10423 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, | 10535 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, |
@@ -10449,7 +10561,6 @@ lpfc_cq_create(struct lpfc_hba *phba, struct lpfc_queue *cq, | |||
10449 | rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL); | 10561 | rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL); |
10450 | 10562 | ||
10451 | /* The IOCTL status is embedded in the mailbox subheader. */ | 10563 | /* The IOCTL status is embedded in the mailbox subheader. */ |
10452 | shdr = (union lpfc_sli4_cfg_shdr *) &cq_create->header.cfg_shdr; | ||
10453 | shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); | 10564 | shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); |
10454 | shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); | 10565 | shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); |
10455 | if (shdr_status || shdr_add_status || rc) { | 10566 | if (shdr_status || shdr_add_status || rc) { |
@@ -10515,20 +10626,20 @@ lpfc_mq_create_fb_init(struct lpfc_hba *phba, struct lpfc_queue *mq, | |||
10515 | bf_set(lpfc_mq_context_valid, &mq_create->u.request.context, 1); | 10626 | bf_set(lpfc_mq_context_valid, &mq_create->u.request.context, 1); |
10516 | switch (mq->entry_count) { | 10627 | switch (mq->entry_count) { |
10517 | case 16: | 10628 | case 16: |
10518 | bf_set(lpfc_mq_context_count, &mq_create->u.request.context, | 10629 | bf_set(lpfc_mq_context_ring_size, &mq_create->u.request.context, |
10519 | LPFC_MQ_CNT_16); | 10630 | LPFC_MQ_RING_SIZE_16); |
10520 | break; | 10631 | break; |
10521 | case 32: | 10632 | case 32: |
10522 | bf_set(lpfc_mq_context_count, &mq_create->u.request.context, | 10633 | bf_set(lpfc_mq_context_ring_size, &mq_create->u.request.context, |
10523 | LPFC_MQ_CNT_32); | 10634 | LPFC_MQ_RING_SIZE_32); |
10524 | break; | 10635 | break; |
10525 | case 64: | 10636 | case 64: |
10526 | bf_set(lpfc_mq_context_count, &mq_create->u.request.context, | 10637 | bf_set(lpfc_mq_context_ring_size, &mq_create->u.request.context, |
10527 | LPFC_MQ_CNT_64); | 10638 | LPFC_MQ_RING_SIZE_64); |
10528 | break; | 10639 | break; |
10529 | case 128: | 10640 | case 128: |
10530 | bf_set(lpfc_mq_context_count, &mq_create->u.request.context, | 10641 | bf_set(lpfc_mq_context_ring_size, &mq_create->u.request.context, |
10531 | LPFC_MQ_CNT_128); | 10642 | LPFC_MQ_RING_SIZE_128); |
10532 | break; | 10643 | break; |
10533 | } | 10644 | } |
10534 | list_for_each_entry(dmabuf, &mq->page_list, list) { | 10645 | list_for_each_entry(dmabuf, &mq->page_list, list) { |
@@ -10586,6 +10697,7 @@ lpfc_mq_create(struct lpfc_hba *phba, struct lpfc_queue *mq, | |||
10586 | length, LPFC_SLI4_MBX_EMBED); | 10697 | length, LPFC_SLI4_MBX_EMBED); |
10587 | 10698 | ||
10588 | mq_create_ext = &mbox->u.mqe.un.mq_create_ext; | 10699 | mq_create_ext = &mbox->u.mqe.un.mq_create_ext; |
10700 | shdr = (union lpfc_sli4_cfg_shdr *) &mq_create_ext->header.cfg_shdr; | ||
10589 | bf_set(lpfc_mbx_mq_create_ext_num_pages, | 10701 | bf_set(lpfc_mbx_mq_create_ext_num_pages, |
10590 | &mq_create_ext->u.request, mq->page_count); | 10702 | &mq_create_ext->u.request, mq->page_count); |
10591 | bf_set(lpfc_mbx_mq_create_ext_async_evt_link, | 10703 | bf_set(lpfc_mbx_mq_create_ext_async_evt_link, |
@@ -10598,9 +10710,15 @@ lpfc_mq_create(struct lpfc_hba *phba, struct lpfc_queue *mq, | |||
10598 | &mq_create_ext->u.request, 1); | 10710 | &mq_create_ext->u.request, 1); |
10599 | bf_set(lpfc_mbx_mq_create_ext_async_evt_sli, | 10711 | bf_set(lpfc_mbx_mq_create_ext_async_evt_sli, |
10600 | &mq_create_ext->u.request, 1); | 10712 | &mq_create_ext->u.request, 1); |
10601 | bf_set(lpfc_mq_context_cq_id, | ||
10602 | &mq_create_ext->u.request.context, cq->queue_id); | ||
10603 | bf_set(lpfc_mq_context_valid, &mq_create_ext->u.request.context, 1); | 10713 | bf_set(lpfc_mq_context_valid, &mq_create_ext->u.request.context, 1); |
10714 | bf_set(lpfc_mbox_hdr_version, &shdr->request, | ||
10715 | phba->sli4_hba.pc_sli4_params.mqv); | ||
10716 | if (phba->sli4_hba.pc_sli4_params.mqv == LPFC_Q_CREATE_VERSION_1) | ||
10717 | bf_set(lpfc_mbx_mq_create_ext_cq_id, &mq_create_ext->u.request, | ||
10718 | cq->queue_id); | ||
10719 | else | ||
10720 | bf_set(lpfc_mq_context_cq_id, &mq_create_ext->u.request.context, | ||
10721 | cq->queue_id); | ||
10604 | switch (mq->entry_count) { | 10722 | switch (mq->entry_count) { |
10605 | default: | 10723 | default: |
10606 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, | 10724 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, |
@@ -10610,20 +10728,24 @@ lpfc_mq_create(struct lpfc_hba *phba, struct lpfc_queue *mq, | |||
10610 | return -EINVAL; | 10728 | return -EINVAL; |
10611 | /* otherwise default to smallest count (drop through) */ | 10729 | /* otherwise default to smallest count (drop through) */ |
10612 | case 16: | 10730 | case 16: |
10613 | bf_set(lpfc_mq_context_count, &mq_create_ext->u.request.context, | 10731 | bf_set(lpfc_mq_context_ring_size, |
10614 | LPFC_MQ_CNT_16); | 10732 | &mq_create_ext->u.request.context, |
10733 | LPFC_MQ_RING_SIZE_16); | ||
10615 | break; | 10734 | break; |
10616 | case 32: | 10735 | case 32: |
10617 | bf_set(lpfc_mq_context_count, &mq_create_ext->u.request.context, | 10736 | bf_set(lpfc_mq_context_ring_size, |
10618 | LPFC_MQ_CNT_32); | 10737 | &mq_create_ext->u.request.context, |
10738 | LPFC_MQ_RING_SIZE_32); | ||
10619 | break; | 10739 | break; |
10620 | case 64: | 10740 | case 64: |
10621 | bf_set(lpfc_mq_context_count, &mq_create_ext->u.request.context, | 10741 | bf_set(lpfc_mq_context_ring_size, |
10622 | LPFC_MQ_CNT_64); | 10742 | &mq_create_ext->u.request.context, |
10743 | LPFC_MQ_RING_SIZE_64); | ||
10623 | break; | 10744 | break; |
10624 | case 128: | 10745 | case 128: |
10625 | bf_set(lpfc_mq_context_count, &mq_create_ext->u.request.context, | 10746 | bf_set(lpfc_mq_context_ring_size, |
10626 | LPFC_MQ_CNT_128); | 10747 | &mq_create_ext->u.request.context, |
10748 | LPFC_MQ_RING_SIZE_128); | ||
10627 | break; | 10749 | break; |
10628 | } | 10750 | } |
10629 | list_for_each_entry(dmabuf, &mq->page_list, list) { | 10751 | list_for_each_entry(dmabuf, &mq->page_list, list) { |
@@ -10634,7 +10756,6 @@ lpfc_mq_create(struct lpfc_hba *phba, struct lpfc_queue *mq, | |||
10634 | putPaddrHigh(dmabuf->phys); | 10756 | putPaddrHigh(dmabuf->phys); |
10635 | } | 10757 | } |
10636 | rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL); | 10758 | rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL); |
10637 | shdr = (union lpfc_sli4_cfg_shdr *) &mq_create_ext->header.cfg_shdr; | ||
10638 | mq->queue_id = bf_get(lpfc_mbx_mq_create_q_id, | 10759 | mq->queue_id = bf_get(lpfc_mbx_mq_create_q_id, |
10639 | &mq_create_ext->u.response); | 10760 | &mq_create_ext->u.response); |
10640 | if (rc != MBX_SUCCESS) { | 10761 | if (rc != MBX_SUCCESS) { |
@@ -10711,6 +10832,7 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq, | |||
10711 | uint32_t shdr_status, shdr_add_status; | 10832 | uint32_t shdr_status, shdr_add_status; |
10712 | union lpfc_sli4_cfg_shdr *shdr; | 10833 | union lpfc_sli4_cfg_shdr *shdr; |
10713 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; | 10834 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; |
10835 | struct dma_address *page; | ||
10714 | 10836 | ||
10715 | if (!phba->sli4_hba.pc_sli4_params.supported) | 10837 | if (!phba->sli4_hba.pc_sli4_params.supported) |
10716 | hw_page_size = SLI4_PAGE_SIZE; | 10838 | hw_page_size = SLI4_PAGE_SIZE; |
@@ -10724,20 +10846,42 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq, | |||
10724 | LPFC_MBOX_OPCODE_FCOE_WQ_CREATE, | 10846 | LPFC_MBOX_OPCODE_FCOE_WQ_CREATE, |
10725 | length, LPFC_SLI4_MBX_EMBED); | 10847 | length, LPFC_SLI4_MBX_EMBED); |
10726 | wq_create = &mbox->u.mqe.un.wq_create; | 10848 | wq_create = &mbox->u.mqe.un.wq_create; |
10849 | shdr = (union lpfc_sli4_cfg_shdr *) &wq_create->header.cfg_shdr; | ||
10727 | bf_set(lpfc_mbx_wq_create_num_pages, &wq_create->u.request, | 10850 | bf_set(lpfc_mbx_wq_create_num_pages, &wq_create->u.request, |
10728 | wq->page_count); | 10851 | wq->page_count); |
10729 | bf_set(lpfc_mbx_wq_create_cq_id, &wq_create->u.request, | 10852 | bf_set(lpfc_mbx_wq_create_cq_id, &wq_create->u.request, |
10730 | cq->queue_id); | 10853 | cq->queue_id); |
10854 | bf_set(lpfc_mbox_hdr_version, &shdr->request, | ||
10855 | phba->sli4_hba.pc_sli4_params.wqv); | ||
10856 | if (phba->sli4_hba.pc_sli4_params.wqv == LPFC_Q_CREATE_VERSION_1) { | ||
10857 | bf_set(lpfc_mbx_wq_create_wqe_count, &wq_create->u.request_1, | ||
10858 | wq->entry_count); | ||
10859 | switch (wq->entry_size) { | ||
10860 | default: | ||
10861 | case 64: | ||
10862 | bf_set(lpfc_mbx_wq_create_wqe_size, | ||
10863 | &wq_create->u.request_1, | ||
10864 | LPFC_WQ_WQE_SIZE_64); | ||
10865 | break; | ||
10866 | case 128: | ||
10867 | bf_set(lpfc_mbx_wq_create_wqe_size, | ||
10868 | &wq_create->u.request_1, | ||
10869 | LPFC_WQ_WQE_SIZE_128); | ||
10870 | break; | ||
10871 | } | ||
10872 | bf_set(lpfc_mbx_wq_create_page_size, &wq_create->u.request_1, | ||
10873 | (PAGE_SIZE/SLI4_PAGE_SIZE)); | ||
10874 | page = wq_create->u.request_1.page; | ||
10875 | } else { | ||
10876 | page = wq_create->u.request.page; | ||
10877 | } | ||
10731 | list_for_each_entry(dmabuf, &wq->page_list, list) { | 10878 | list_for_each_entry(dmabuf, &wq->page_list, list) { |
10732 | memset(dmabuf->virt, 0, hw_page_size); | 10879 | memset(dmabuf->virt, 0, hw_page_size); |
10733 | wq_create->u.request.page[dmabuf->buffer_tag].addr_lo = | 10880 | page[dmabuf->buffer_tag].addr_lo = putPaddrLow(dmabuf->phys); |
10734 | putPaddrLow(dmabuf->phys); | 10881 | page[dmabuf->buffer_tag].addr_hi = putPaddrHigh(dmabuf->phys); |
10735 | wq_create->u.request.page[dmabuf->buffer_tag].addr_hi = | ||
10736 | putPaddrHigh(dmabuf->phys); | ||
10737 | } | 10882 | } |
10738 | rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL); | 10883 | rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL); |
10739 | /* The IOCTL status is embedded in the mailbox subheader. */ | 10884 | /* The IOCTL status is embedded in the mailbox subheader. */ |
10740 | shdr = (union lpfc_sli4_cfg_shdr *) &wq_create->header.cfg_shdr; | ||
10741 | shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); | 10885 | shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); |
10742 | shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); | 10886 | shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); |
10743 | if (shdr_status || shdr_add_status || rc) { | 10887 | if (shdr_status || shdr_add_status || rc) { |
@@ -10815,37 +10959,51 @@ lpfc_rq_create(struct lpfc_hba *phba, struct lpfc_queue *hrq, | |||
10815 | LPFC_MBOX_OPCODE_FCOE_RQ_CREATE, | 10959 | LPFC_MBOX_OPCODE_FCOE_RQ_CREATE, |
10816 | length, LPFC_SLI4_MBX_EMBED); | 10960 | length, LPFC_SLI4_MBX_EMBED); |
10817 | rq_create = &mbox->u.mqe.un.rq_create; | 10961 | rq_create = &mbox->u.mqe.un.rq_create; |
10818 | switch (hrq->entry_count) { | 10962 | shdr = (union lpfc_sli4_cfg_shdr *) &rq_create->header.cfg_shdr; |
10819 | default: | 10963 | bf_set(lpfc_mbox_hdr_version, &shdr->request, |
10820 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, | 10964 | phba->sli4_hba.pc_sli4_params.rqv); |
10821 | "2535 Unsupported RQ count. (%d)\n", | 10965 | if (phba->sli4_hba.pc_sli4_params.rqv == LPFC_Q_CREATE_VERSION_1) { |
10822 | hrq->entry_count); | 10966 | bf_set(lpfc_rq_context_rqe_count_1, |
10823 | if (hrq->entry_count < 512) | 10967 | &rq_create->u.request.context, |
10824 | return -EINVAL; | 10968 | hrq->entry_count); |
10825 | /* otherwise default to smallest count (drop through) */ | 10969 | rq_create->u.request.context.buffer_size = LPFC_HDR_BUF_SIZE; |
10826 | case 512: | 10970 | } else { |
10827 | bf_set(lpfc_rq_context_rq_size, &rq_create->u.request.context, | 10971 | switch (hrq->entry_count) { |
10828 | LPFC_RQ_RING_SIZE_512); | 10972 | default: |
10829 | break; | 10973 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, |
10830 | case 1024: | 10974 | "2535 Unsupported RQ count. (%d)\n", |
10831 | bf_set(lpfc_rq_context_rq_size, &rq_create->u.request.context, | 10975 | hrq->entry_count); |
10832 | LPFC_RQ_RING_SIZE_1024); | 10976 | if (hrq->entry_count < 512) |
10833 | break; | 10977 | return -EINVAL; |
10834 | case 2048: | 10978 | /* otherwise default to smallest count (drop through) */ |
10835 | bf_set(lpfc_rq_context_rq_size, &rq_create->u.request.context, | 10979 | case 512: |
10836 | LPFC_RQ_RING_SIZE_2048); | 10980 | bf_set(lpfc_rq_context_rqe_count, |
10837 | break; | 10981 | &rq_create->u.request.context, |
10838 | case 4096: | 10982 | LPFC_RQ_RING_SIZE_512); |
10839 | bf_set(lpfc_rq_context_rq_size, &rq_create->u.request.context, | 10983 | break; |
10840 | LPFC_RQ_RING_SIZE_4096); | 10984 | case 1024: |
10841 | break; | 10985 | bf_set(lpfc_rq_context_rqe_count, |
10986 | &rq_create->u.request.context, | ||
10987 | LPFC_RQ_RING_SIZE_1024); | ||
10988 | break; | ||
10989 | case 2048: | ||
10990 | bf_set(lpfc_rq_context_rqe_count, | ||
10991 | &rq_create->u.request.context, | ||
10992 | LPFC_RQ_RING_SIZE_2048); | ||
10993 | break; | ||
10994 | case 4096: | ||
10995 | bf_set(lpfc_rq_context_rqe_count, | ||
10996 | &rq_create->u.request.context, | ||
10997 | LPFC_RQ_RING_SIZE_4096); | ||
10998 | break; | ||
10999 | } | ||
11000 | bf_set(lpfc_rq_context_buf_size, &rq_create->u.request.context, | ||
11001 | LPFC_HDR_BUF_SIZE); | ||
10842 | } | 11002 | } |
10843 | bf_set(lpfc_rq_context_cq_id, &rq_create->u.request.context, | 11003 | bf_set(lpfc_rq_context_cq_id, &rq_create->u.request.context, |
10844 | cq->queue_id); | 11004 | cq->queue_id); |
10845 | bf_set(lpfc_mbx_rq_create_num_pages, &rq_create->u.request, | 11005 | bf_set(lpfc_mbx_rq_create_num_pages, &rq_create->u.request, |
10846 | hrq->page_count); | 11006 | hrq->page_count); |
10847 | bf_set(lpfc_rq_context_buf_size, &rq_create->u.request.context, | ||
10848 | LPFC_HDR_BUF_SIZE); | ||
10849 | list_for_each_entry(dmabuf, &hrq->page_list, list) { | 11007 | list_for_each_entry(dmabuf, &hrq->page_list, list) { |
10850 | memset(dmabuf->virt, 0, hw_page_size); | 11008 | memset(dmabuf->virt, 0, hw_page_size); |
10851 | rq_create->u.request.page[dmabuf->buffer_tag].addr_lo = | 11009 | rq_create->u.request.page[dmabuf->buffer_tag].addr_lo = |
@@ -10855,7 +11013,6 @@ lpfc_rq_create(struct lpfc_hba *phba, struct lpfc_queue *hrq, | |||
10855 | } | 11013 | } |
10856 | rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL); | 11014 | rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL); |
10857 | /* The IOCTL status is embedded in the mailbox subheader. */ | 11015 | /* The IOCTL status is embedded in the mailbox subheader. */ |
10858 | shdr = (union lpfc_sli4_cfg_shdr *) &rq_create->header.cfg_shdr; | ||
10859 | shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); | 11016 | shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); |
10860 | shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); | 11017 | shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); |
10861 | if (shdr_status || shdr_add_status || rc) { | 11018 | if (shdr_status || shdr_add_status || rc) { |
@@ -10881,37 +11038,50 @@ lpfc_rq_create(struct lpfc_hba *phba, struct lpfc_queue *hrq, | |||
10881 | lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE, | 11038 | lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE, |
10882 | LPFC_MBOX_OPCODE_FCOE_RQ_CREATE, | 11039 | LPFC_MBOX_OPCODE_FCOE_RQ_CREATE, |
10883 | length, LPFC_SLI4_MBX_EMBED); | 11040 | length, LPFC_SLI4_MBX_EMBED); |
10884 | switch (drq->entry_count) { | 11041 | bf_set(lpfc_mbox_hdr_version, &shdr->request, |
10885 | default: | 11042 | phba->sli4_hba.pc_sli4_params.rqv); |
10886 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, | 11043 | if (phba->sli4_hba.pc_sli4_params.rqv == LPFC_Q_CREATE_VERSION_1) { |
10887 | "2536 Unsupported RQ count. (%d)\n", | 11044 | bf_set(lpfc_rq_context_rqe_count_1, |
10888 | drq->entry_count); | 11045 | &rq_create->u.request.context, |
10889 | if (drq->entry_count < 512) | 11046 | hrq->entry_count); |
10890 | return -EINVAL; | 11047 | rq_create->u.request.context.buffer_size = LPFC_DATA_BUF_SIZE; |
10891 | /* otherwise default to smallest count (drop through) */ | 11048 | } else { |
10892 | case 512: | 11049 | switch (drq->entry_count) { |
10893 | bf_set(lpfc_rq_context_rq_size, &rq_create->u.request.context, | 11050 | default: |
10894 | LPFC_RQ_RING_SIZE_512); | 11051 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, |
10895 | break; | 11052 | "2536 Unsupported RQ count. (%d)\n", |
10896 | case 1024: | 11053 | drq->entry_count); |
10897 | bf_set(lpfc_rq_context_rq_size, &rq_create->u.request.context, | 11054 | if (drq->entry_count < 512) |
10898 | LPFC_RQ_RING_SIZE_1024); | 11055 | return -EINVAL; |
10899 | break; | 11056 | /* otherwise default to smallest count (drop through) */ |
10900 | case 2048: | 11057 | case 512: |
10901 | bf_set(lpfc_rq_context_rq_size, &rq_create->u.request.context, | 11058 | bf_set(lpfc_rq_context_rqe_count, |
10902 | LPFC_RQ_RING_SIZE_2048); | 11059 | &rq_create->u.request.context, |
10903 | break; | 11060 | LPFC_RQ_RING_SIZE_512); |
10904 | case 4096: | 11061 | break; |
10905 | bf_set(lpfc_rq_context_rq_size, &rq_create->u.request.context, | 11062 | case 1024: |
10906 | LPFC_RQ_RING_SIZE_4096); | 11063 | bf_set(lpfc_rq_context_rqe_count, |
10907 | break; | 11064 | &rq_create->u.request.context, |
11065 | LPFC_RQ_RING_SIZE_1024); | ||
11066 | break; | ||
11067 | case 2048: | ||
11068 | bf_set(lpfc_rq_context_rqe_count, | ||
11069 | &rq_create->u.request.context, | ||
11070 | LPFC_RQ_RING_SIZE_2048); | ||
11071 | break; | ||
11072 | case 4096: | ||
11073 | bf_set(lpfc_rq_context_rqe_count, | ||
11074 | &rq_create->u.request.context, | ||
11075 | LPFC_RQ_RING_SIZE_4096); | ||
11076 | break; | ||
11077 | } | ||
11078 | bf_set(lpfc_rq_context_buf_size, &rq_create->u.request.context, | ||
11079 | LPFC_DATA_BUF_SIZE); | ||
10908 | } | 11080 | } |
10909 | bf_set(lpfc_rq_context_cq_id, &rq_create->u.request.context, | 11081 | bf_set(lpfc_rq_context_cq_id, &rq_create->u.request.context, |
10910 | cq->queue_id); | 11082 | cq->queue_id); |
10911 | bf_set(lpfc_mbx_rq_create_num_pages, &rq_create->u.request, | 11083 | bf_set(lpfc_mbx_rq_create_num_pages, &rq_create->u.request, |
10912 | drq->page_count); | 11084 | drq->page_count); |
10913 | bf_set(lpfc_rq_context_buf_size, &rq_create->u.request.context, | ||
10914 | LPFC_DATA_BUF_SIZE); | ||
10915 | list_for_each_entry(dmabuf, &drq->page_list, list) { | 11085 | list_for_each_entry(dmabuf, &drq->page_list, list) { |
10916 | rq_create->u.request.page[dmabuf->buffer_tag].addr_lo = | 11086 | rq_create->u.request.page[dmabuf->buffer_tag].addr_lo = |
10917 | putPaddrLow(dmabuf->phys); | 11087 | putPaddrLow(dmabuf->phys); |
@@ -11580,6 +11750,7 @@ lpfc_fc_frame_check(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr) | |||
11580 | static char *rctl_names[] = FC_RCTL_NAMES_INIT; | 11750 | static char *rctl_names[] = FC_RCTL_NAMES_INIT; |
11581 | char *type_names[] = FC_TYPE_NAMES_INIT; | 11751 | char *type_names[] = FC_TYPE_NAMES_INIT; |
11582 | struct fc_vft_header *fc_vft_hdr; | 11752 | struct fc_vft_header *fc_vft_hdr; |
11753 | uint32_t *header = (uint32_t *) fc_hdr; | ||
11583 | 11754 | ||
11584 | switch (fc_hdr->fh_r_ctl) { | 11755 | switch (fc_hdr->fh_r_ctl) { |
11585 | case FC_RCTL_DD_UNCAT: /* uncategorized information */ | 11756 | case FC_RCTL_DD_UNCAT: /* uncategorized information */ |
@@ -11628,10 +11799,15 @@ lpfc_fc_frame_check(struct lpfc_hba *phba, struct fc_frame_header *fc_hdr) | |||
11628 | default: | 11799 | default: |
11629 | goto drop; | 11800 | goto drop; |
11630 | } | 11801 | } |
11802 | |||
11631 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, | 11803 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, |
11632 | "2538 Received frame rctl:%s type:%s\n", | 11804 | "2538 Received frame rctl:%s type:%s " |
11805 | "Frame Data:%08x %08x %08x %08x %08x %08x\n", | ||
11633 | rctl_names[fc_hdr->fh_r_ctl], | 11806 | rctl_names[fc_hdr->fh_r_ctl], |
11634 | type_names[fc_hdr->fh_type]); | 11807 | type_names[fc_hdr->fh_type], |
11808 | be32_to_cpu(header[0]), be32_to_cpu(header[1]), | ||
11809 | be32_to_cpu(header[2]), be32_to_cpu(header[3]), | ||
11810 | be32_to_cpu(header[4]), be32_to_cpu(header[5])); | ||
11635 | return 0; | 11811 | return 0; |
11636 | drop: | 11812 | drop: |
11637 | lpfc_printf_log(phba, KERN_WARNING, LOG_ELS, | 11813 | lpfc_printf_log(phba, KERN_WARNING, LOG_ELS, |
@@ -11928,17 +12104,17 @@ lpfc_sli4_abort_partial_seq(struct lpfc_vport *vport, | |||
11928 | } | 12104 | } |
11929 | 12105 | ||
11930 | /** | 12106 | /** |
11931 | * lpfc_sli4_seq_abort_acc_cmpl - Accept seq abort iocb complete handler | 12107 | * lpfc_sli4_seq_abort_rsp_cmpl - BLS ABORT RSP seq abort iocb complete handler |
11932 | * @phba: Pointer to HBA context object. | 12108 | * @phba: Pointer to HBA context object. |
11933 | * @cmd_iocbq: pointer to the command iocbq structure. | 12109 | * @cmd_iocbq: pointer to the command iocbq structure. |
11934 | * @rsp_iocbq: pointer to the response iocbq structure. | 12110 | * @rsp_iocbq: pointer to the response iocbq structure. |
11935 | * | 12111 | * |
11936 | * This function handles the sequence abort accept iocb command complete | 12112 | * This function handles the sequence abort response iocb command complete |
11937 | * event. It properly releases the memory allocated to the sequence abort | 12113 | * event. It properly releases the memory allocated to the sequence abort |
11938 | * accept iocb. | 12114 | * accept iocb. |
11939 | **/ | 12115 | **/ |
11940 | static void | 12116 | static void |
11941 | lpfc_sli4_seq_abort_acc_cmpl(struct lpfc_hba *phba, | 12117 | lpfc_sli4_seq_abort_rsp_cmpl(struct lpfc_hba *phba, |
11942 | struct lpfc_iocbq *cmd_iocbq, | 12118 | struct lpfc_iocbq *cmd_iocbq, |
11943 | struct lpfc_iocbq *rsp_iocbq) | 12119 | struct lpfc_iocbq *rsp_iocbq) |
11944 | { | 12120 | { |
@@ -11947,15 +12123,15 @@ lpfc_sli4_seq_abort_acc_cmpl(struct lpfc_hba *phba, | |||
11947 | } | 12123 | } |
11948 | 12124 | ||
11949 | /** | 12125 | /** |
11950 | * lpfc_sli4_seq_abort_acc - Accept sequence abort | 12126 | * lpfc_sli4_seq_abort_rsp - bls rsp to sequence abort |
11951 | * @phba: Pointer to HBA context object. | 12127 | * @phba: Pointer to HBA context object. |
11952 | * @fc_hdr: pointer to a FC frame header. | 12128 | * @fc_hdr: pointer to a FC frame header. |
11953 | * | 12129 | * |
11954 | * This function sends a basic accept to a previous unsol sequence abort | 12130 | * This function sends a basic response to a previous unsol sequence abort |
11955 | * event after aborting the sequence handling. | 12131 | * event after aborting the sequence handling. |
11956 | **/ | 12132 | **/ |
11957 | static void | 12133 | static void |
11958 | lpfc_sli4_seq_abort_acc(struct lpfc_hba *phba, | 12134 | lpfc_sli4_seq_abort_rsp(struct lpfc_hba *phba, |
11959 | struct fc_frame_header *fc_hdr) | 12135 | struct fc_frame_header *fc_hdr) |
11960 | { | 12136 | { |
11961 | struct lpfc_iocbq *ctiocb = NULL; | 12137 | struct lpfc_iocbq *ctiocb = NULL; |
@@ -11963,6 +12139,7 @@ lpfc_sli4_seq_abort_acc(struct lpfc_hba *phba, | |||
11963 | uint16_t oxid, rxid; | 12139 | uint16_t oxid, rxid; |
11964 | uint32_t sid, fctl; | 12140 | uint32_t sid, fctl; |
11965 | IOCB_t *icmd; | 12141 | IOCB_t *icmd; |
12142 | int rc; | ||
11966 | 12143 | ||
11967 | if (!lpfc_is_link_up(phba)) | 12144 | if (!lpfc_is_link_up(phba)) |
11968 | return; | 12145 | return; |
@@ -11983,7 +12160,7 @@ lpfc_sli4_seq_abort_acc(struct lpfc_hba *phba, | |||
11983 | + phba->sli4_hba.max_cfg_param.xri_base)) | 12160 | + phba->sli4_hba.max_cfg_param.xri_base)) |
11984 | lpfc_set_rrq_active(phba, ndlp, rxid, oxid, 0); | 12161 | lpfc_set_rrq_active(phba, ndlp, rxid, oxid, 0); |
11985 | 12162 | ||
11986 | /* Allocate buffer for acc iocb */ | 12163 | /* Allocate buffer for rsp iocb */ |
11987 | ctiocb = lpfc_sli_get_iocbq(phba); | 12164 | ctiocb = lpfc_sli_get_iocbq(phba); |
11988 | if (!ctiocb) | 12165 | if (!ctiocb) |
11989 | return; | 12166 | return; |
@@ -12008,32 +12185,54 @@ lpfc_sli4_seq_abort_acc(struct lpfc_hba *phba, | |||
12008 | 12185 | ||
12009 | ctiocb->iocb_cmpl = NULL; | 12186 | ctiocb->iocb_cmpl = NULL; |
12010 | ctiocb->vport = phba->pport; | 12187 | ctiocb->vport = phba->pport; |
12011 | ctiocb->iocb_cmpl = lpfc_sli4_seq_abort_acc_cmpl; | 12188 | ctiocb->iocb_cmpl = lpfc_sli4_seq_abort_rsp_cmpl; |
12189 | ctiocb->sli4_xritag = NO_XRI; | ||
12190 | |||
12191 | /* If the oxid maps to the FCP XRI range or if it is out of range, | ||
12192 | * send a BLS_RJT. The driver no longer has that exchange. | ||
12193 | * Override the IOCB for a BA_RJT. | ||
12194 | */ | ||
12195 | if (oxid > (phba->sli4_hba.max_cfg_param.max_xri + | ||
12196 | phba->sli4_hba.max_cfg_param.xri_base) || | ||
12197 | oxid > (lpfc_sli4_get_els_iocb_cnt(phba) + | ||
12198 | phba->sli4_hba.max_cfg_param.xri_base)) { | ||
12199 | icmd->un.xseq64.w5.hcsw.Rctl = FC_RCTL_BA_RJT; | ||
12200 | bf_set(lpfc_vndr_code, &icmd->un.bls_rsp, 0); | ||
12201 | bf_set(lpfc_rsn_expln, &icmd->un.bls_rsp, FC_BA_RJT_INV_XID); | ||
12202 | bf_set(lpfc_rsn_code, &icmd->un.bls_rsp, FC_BA_RJT_UNABLE); | ||
12203 | } | ||
12012 | 12204 | ||
12013 | if (fctl & FC_FC_EX_CTX) { | 12205 | if (fctl & FC_FC_EX_CTX) { |
12014 | /* ABTS sent by responder to CT exchange, construction | 12206 | /* ABTS sent by responder to CT exchange, construction |
12015 | * of BA_ACC will use OX_ID from ABTS for the XRI_TAG | 12207 | * of BA_ACC will use OX_ID from ABTS for the XRI_TAG |
12016 | * field and RX_ID from ABTS for RX_ID field. | 12208 | * field and RX_ID from ABTS for RX_ID field. |
12017 | */ | 12209 | */ |
12018 | bf_set(lpfc_abts_orig, &icmd->un.bls_acc, LPFC_ABTS_UNSOL_RSP); | 12210 | bf_set(lpfc_abts_orig, &icmd->un.bls_rsp, LPFC_ABTS_UNSOL_RSP); |
12019 | bf_set(lpfc_abts_rxid, &icmd->un.bls_acc, rxid); | 12211 | bf_set(lpfc_abts_rxid, &icmd->un.bls_rsp, rxid); |
12020 | ctiocb->sli4_xritag = oxid; | ||
12021 | } else { | 12212 | } else { |
12022 | /* ABTS sent by initiator to CT exchange, construction | 12213 | /* ABTS sent by initiator to CT exchange, construction |
12023 | * of BA_ACC will need to allocate a new XRI as for the | 12214 | * of BA_ACC will need to allocate a new XRI as for the |
12024 | * XRI_TAG and RX_ID fields. | 12215 | * XRI_TAG and RX_ID fields. |
12025 | */ | 12216 | */ |
12026 | bf_set(lpfc_abts_orig, &icmd->un.bls_acc, LPFC_ABTS_UNSOL_INT); | 12217 | bf_set(lpfc_abts_orig, &icmd->un.bls_rsp, LPFC_ABTS_UNSOL_INT); |
12027 | bf_set(lpfc_abts_rxid, &icmd->un.bls_acc, NO_XRI); | 12218 | bf_set(lpfc_abts_rxid, &icmd->un.bls_rsp, NO_XRI); |
12028 | ctiocb->sli4_xritag = NO_XRI; | ||
12029 | } | 12219 | } |
12030 | bf_set(lpfc_abts_oxid, &icmd->un.bls_acc, oxid); | 12220 | bf_set(lpfc_abts_oxid, &icmd->un.bls_rsp, oxid); |
12031 | 12221 | ||
12032 | /* Xmit CT abts accept on exchange <xid> */ | 12222 | /* Xmit CT abts response on exchange <xid> */ |
12033 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, | 12223 | lpfc_printf_log(phba, KERN_INFO, LOG_ELS, |
12034 | "1200 Xmit CT ABTS ACC on exchange x%x Data: x%x\n", | 12224 | "1200 Send BLS cmd x%x on oxid x%x Data: x%x\n", |
12035 | CMD_XMIT_BLS_RSP64_CX, phba->link_state); | 12225 | icmd->un.xseq64.w5.hcsw.Rctl, oxid, phba->link_state); |
12036 | lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, ctiocb, 0); | 12226 | |
12227 | rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, ctiocb, 0); | ||
12228 | if (rc == IOCB_ERROR) { | ||
12229 | lpfc_printf_log(phba, KERN_ERR, LOG_ELS, | ||
12230 | "2925 Failed to issue CT ABTS RSP x%x on " | ||
12231 | "xri x%x, Data x%x\n", | ||
12232 | icmd->un.xseq64.w5.hcsw.Rctl, oxid, | ||
12233 | phba->link_state); | ||
12234 | lpfc_sli_release_iocbq(phba, ctiocb); | ||
12235 | } | ||
12037 | } | 12236 | } |
12038 | 12237 | ||
12039 | /** | 12238 | /** |
@@ -12081,7 +12280,7 @@ lpfc_sli4_handle_unsol_abort(struct lpfc_vport *vport, | |||
12081 | lpfc_in_buf_free(phba, &dmabuf->dbuf); | 12280 | lpfc_in_buf_free(phba, &dmabuf->dbuf); |
12082 | } | 12281 | } |
12083 | /* Send basic accept (BA_ACC) to the abort requester */ | 12282 | /* Send basic accept (BA_ACC) to the abort requester */ |
12084 | lpfc_sli4_seq_abort_acc(phba, &fc_hdr); | 12283 | lpfc_sli4_seq_abort_rsp(phba, &fc_hdr); |
12085 | } | 12284 | } |
12086 | 12285 | ||
12087 | /** | 12286 | /** |
@@ -12772,7 +12971,7 @@ lpfc_sli4_build_dflt_fcf_record(struct lpfc_hba *phba, | |||
12772 | * record and processing it one at a time starting from the @fcf_index | 12971 | * record and processing it one at a time starting from the @fcf_index |
12773 | * for initial FCF discovery or fast FCF failover rediscovery. | 12972 | * for initial FCF discovery or fast FCF failover rediscovery. |
12774 | * | 12973 | * |
12775 | * Return 0 if the mailbox command is submitted sucessfully, none 0 | 12974 | * Return 0 if the mailbox command is submitted successfully, none 0 |
12776 | * otherwise. | 12975 | * otherwise. |
12777 | **/ | 12976 | **/ |
12778 | int | 12977 | int |
@@ -12833,7 +13032,7 @@ fail_fcf_scan: | |||
12833 | * This routine is invoked to read an FCF record indicated by @fcf_index | 13032 | * This routine is invoked to read an FCF record indicated by @fcf_index |
12834 | * and to use it for FLOGI roundrobin FCF failover. | 13033 | * and to use it for FLOGI roundrobin FCF failover. |
12835 | * | 13034 | * |
12836 | * Return 0 if the mailbox command is submitted sucessfully, none 0 | 13035 | * Return 0 if the mailbox command is submitted successfully, none 0 |
12837 | * otherwise. | 13036 | * otherwise. |
12838 | **/ | 13037 | **/ |
12839 | int | 13038 | int |
@@ -12879,7 +13078,7 @@ fail_fcf_read: | |||
12879 | * This routine is invoked to read an FCF record indicated by @fcf_index to | 13078 | * This routine is invoked to read an FCF record indicated by @fcf_index to |
12880 | * determine whether it's eligible for FLOGI roundrobin failover list. | 13079 | * determine whether it's eligible for FLOGI roundrobin failover list. |
12881 | * | 13080 | * |
12882 | * Return 0 if the mailbox command is submitted sucessfully, none 0 | 13081 | * Return 0 if the mailbox command is submitted successfully, none 0 |
12883 | * otherwise. | 13082 | * otherwise. |
12884 | **/ | 13083 | **/ |
12885 | int | 13084 | int |
diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h index 595056b89608..1a3cbf88f2ce 100644 --- a/drivers/scsi/lpfc/lpfc_sli4.h +++ b/drivers/scsi/lpfc/lpfc_sli4.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2009 Emulex. All rights reserved. * | 4 | * Copyright (C) 2009-2011 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
diff --git a/drivers/scsi/lpfc/lpfc_version.h b/drivers/scsi/lpfc/lpfc_version.h index 0a4d376dbca5..2404d1d65563 100644 --- a/drivers/scsi/lpfc/lpfc_version.h +++ b/drivers/scsi/lpfc/lpfc_version.h | |||
@@ -18,7 +18,7 @@ | |||
18 | * included with this package. * | 18 | * included with this package. * |
19 | *******************************************************************/ | 19 | *******************************************************************/ |
20 | 20 | ||
21 | #define LPFC_DRIVER_VERSION "8.3.21" | 21 | #define LPFC_DRIVER_VERSION "8.3.22" |
22 | #define LPFC_DRIVER_NAME "lpfc" | 22 | #define LPFC_DRIVER_NAME "lpfc" |
23 | #define LPFC_SP_DRIVER_HANDLER_NAME "lpfc:sp" | 23 | #define LPFC_SP_DRIVER_HANDLER_NAME "lpfc:sp" |
24 | #define LPFC_FP_DRIVER_HANDLER_NAME "lpfc:fp" | 24 | #define LPFC_FP_DRIVER_HANDLER_NAME "lpfc:fp" |
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index c212694a9714..f2684dd09ed0 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c | |||
@@ -284,7 +284,7 @@ mega_query_adapter(adapter_t *adapter) | |||
284 | 284 | ||
285 | adapter->host->max_id = 16; /* max targets per channel */ | 285 | adapter->host->max_id = 16; /* max targets per channel */ |
286 | 286 | ||
287 | adapter->host->max_lun = 7; /* Upto 7 luns for non disk devices */ | 287 | adapter->host->max_lun = 7; /* Up to 7 luns for non disk devices */ |
288 | 288 | ||
289 | adapter->host->cmd_per_lun = max_cmd_per_lun; | 289 | adapter->host->cmd_per_lun = max_cmd_per_lun; |
290 | 290 | ||
@@ -3734,7 +3734,7 @@ mega_m_to_n(void __user *arg, nitioctl_t *uioc) | |||
3734 | * check is the application conforms to NIT. We do not have to do much | 3734 | * check is the application conforms to NIT. We do not have to do much |
3735 | * in that case. | 3735 | * in that case. |
3736 | * We exploit the fact that the signature is stored in the very | 3736 | * We exploit the fact that the signature is stored in the very |
3737 | * begining of the structure. | 3737 | * beginning of the structure. |
3738 | */ | 3738 | */ |
3739 | 3739 | ||
3740 | if( copy_from_user(signature, arg, 7) ) | 3740 | if( copy_from_user(signature, arg, 7) ) |
diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h index 853411911b2e..9a7897f8ca43 100644 --- a/drivers/scsi/megaraid.h +++ b/drivers/scsi/megaraid.h | |||
@@ -532,9 +532,9 @@ struct uioctl_t { | |||
532 | 532 | ||
533 | /* | 533 | /* |
534 | * struct mcontroller is used to pass information about the controllers in the | 534 | * struct mcontroller is used to pass information about the controllers in the |
535 | * system. Its upto the application how to use the information. We are passing | 535 | * system. Its up to the application how to use the information. We are passing |
536 | * as much info about the cards as possible and useful. Before issuing the | 536 | * as much info about the cards as possible and useful. Before issuing the |
537 | * call to find information about the cards, the applicaiton needs to issue a | 537 | * call to find information about the cards, the application needs to issue a |
538 | * ioctl first to find out the number of controllers in the system. | 538 | * ioctl first to find out the number of controllers in the system. |
539 | */ | 539 | */ |
540 | #define MAX_CONTROLLERS 32 | 540 | #define MAX_CONTROLLERS 32 |
@@ -804,7 +804,7 @@ typedef struct { | |||
804 | unsigned long base; | 804 | unsigned long base; |
805 | void __iomem *mmio_base; | 805 | void __iomem *mmio_base; |
806 | 806 | ||
807 | /* mbox64 with mbox not aligned on 16-byte boundry */ | 807 | /* mbox64 with mbox not aligned on 16-byte boundary */ |
808 | mbox64_t *una_mbox64; | 808 | mbox64_t *una_mbox64; |
809 | dma_addr_t una_mbox64_dma; | 809 | dma_addr_t una_mbox64_dma; |
810 | 810 | ||
diff --git a/drivers/scsi/megaraid/mbox_defs.h b/drivers/scsi/megaraid/mbox_defs.h index ce2487a888ed..e01c6f7c2cac 100644 --- a/drivers/scsi/megaraid/mbox_defs.h +++ b/drivers/scsi/megaraid/mbox_defs.h | |||
@@ -660,7 +660,7 @@ typedef struct { | |||
660 | * @lparam : logical drives parameters | 660 | * @lparam : logical drives parameters |
661 | * @span : span | 661 | * @span : span |
662 | * | 662 | * |
663 | * 8-LD logical drive with upto 8 spans | 663 | * 8-LD logical drive with up to 8 spans |
664 | */ | 664 | */ |
665 | typedef struct { | 665 | typedef struct { |
666 | logdrv_param_t lparam; | 666 | logdrv_param_t lparam; |
@@ -673,7 +673,7 @@ typedef struct { | |||
673 | * @lparam : logical drives parameters | 673 | * @lparam : logical drives parameters |
674 | * @span : span | 674 | * @span : span |
675 | * | 675 | * |
676 | * 8-LD logical drive with upto 4 spans | 676 | * 8-LD logical drive with up to 4 spans |
677 | */ | 677 | */ |
678 | typedef struct { | 678 | typedef struct { |
679 | logdrv_param_t lparam; | 679 | logdrv_param_t lparam; |
@@ -720,7 +720,7 @@ typedef struct { | |||
720 | * @ldrv : logical drives information | 720 | * @ldrv : logical drives information |
721 | * @pdrv : physical drives information | 721 | * @pdrv : physical drives information |
722 | * | 722 | * |
723 | * Disk array for 8LD logical drives with upto 8 spans | 723 | * Disk array for 8LD logical drives with up to 8 spans |
724 | */ | 724 | */ |
725 | typedef struct { | 725 | typedef struct { |
726 | uint8_t numldrv; | 726 | uint8_t numldrv; |
@@ -737,7 +737,7 @@ typedef struct { | |||
737 | * @ldrv : logical drives information | 737 | * @ldrv : logical drives information |
738 | * @pdrv : physical drives information | 738 | * @pdrv : physical drives information |
739 | * | 739 | * |
740 | * Disk array for 8LD logical drives with upto 4 spans | 740 | * Disk array for 8LD logical drives with up to 4 spans |
741 | */ | 741 | */ |
742 | typedef struct { | 742 | typedef struct { |
743 | uint8_t numldrv; | 743 | uint8_t numldrv; |
diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c index 5708cb27d078..1dba32870b4c 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.c +++ b/drivers/scsi/megaraid/megaraid_mbox.c | |||
@@ -2689,7 +2689,7 @@ megaraid_reset_handler(struct scsi_cmnd *scp) | |||
2689 | (MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT) - i)); | 2689 | (MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT) - i)); |
2690 | } | 2690 | } |
2691 | 2691 | ||
2692 | // bailout if no recovery happended in reset time | 2692 | // bailout if no recovery happened in reset time |
2693 | if (adapter->outstanding_cmds == 0) { | 2693 | if (adapter->outstanding_cmds == 0) { |
2694 | break; | 2694 | break; |
2695 | } | 2695 | } |
@@ -3452,7 +3452,7 @@ megaraid_mbox_display_scb(adapter_t *adapter, scb_t *scb) | |||
3452 | * megaraid_mbox_setup_device_map - manage device ids | 3452 | * megaraid_mbox_setup_device_map - manage device ids |
3453 | * @adapter : Driver's soft state | 3453 | * @adapter : Driver's soft state |
3454 | * | 3454 | * |
3455 | * Manange the device ids to have an appropraite mapping between the kernel | 3455 | * Manange the device ids to have an appropriate mapping between the kernel |
3456 | * scsi addresses and megaraid scsi and logical drive addresses. We export | 3456 | * scsi addresses and megaraid scsi and logical drive addresses. We export |
3457 | * scsi devices on their actual addresses, whereas the logical drives are | 3457 | * scsi devices on their actual addresses, whereas the logical drives are |
3458 | * exported on a virtual scsi channel. | 3458 | * exported on a virtual scsi channel. |
@@ -3973,7 +3973,7 @@ megaraid_sysfs_get_ldmap_timeout(unsigned long data) | |||
3973 | * NOTE: The commands issuance functionality is not generalized and | 3973 | * NOTE: The commands issuance functionality is not generalized and |
3974 | * implemented in context of "get ld map" command only. If required, the | 3974 | * implemented in context of "get ld map" command only. If required, the |
3975 | * command issuance logical can be trivially pulled out and implemented as a | 3975 | * command issuance logical can be trivially pulled out and implemented as a |
3976 | * standalone libary. For now, this should suffice since there is no other | 3976 | * standalone library. For now, this should suffice since there is no other |
3977 | * user of this interface. | 3977 | * user of this interface. |
3978 | * | 3978 | * |
3979 | * Return 0 on success. | 3979 | * Return 0 on success. |
diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h index 635b228c3ead..046dcc672ec1 100644 --- a/drivers/scsi/megaraid/megaraid_sas.h +++ b/drivers/scsi/megaraid/megaraid_sas.h | |||
@@ -1347,7 +1347,7 @@ struct megasas_instance { | |||
1347 | struct timer_list io_completion_timer; | 1347 | struct timer_list io_completion_timer; |
1348 | struct list_head internal_reset_pending_q; | 1348 | struct list_head internal_reset_pending_q; |
1349 | 1349 | ||
1350 | /* Ptr to hba specfic information */ | 1350 | /* Ptr to hba specific information */ |
1351 | void *ctrl_context; | 1351 | void *ctrl_context; |
1352 | u8 msi_flag; | 1352 | u8 msi_flag; |
1353 | struct msix_entry msixentry; | 1353 | struct msix_entry msixentry; |
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index bbd10c81fd9c..66d4cea4df98 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c | |||
@@ -1698,7 +1698,7 @@ void megasas_do_ocr(struct megasas_instance *instance) | |||
1698 | * megasas_wait_for_outstanding - Wait for all outstanding cmds | 1698 | * megasas_wait_for_outstanding - Wait for all outstanding cmds |
1699 | * @instance: Adapter soft state | 1699 | * @instance: Adapter soft state |
1700 | * | 1700 | * |
1701 | * This function waits for upto MEGASAS_RESET_WAIT_TIME seconds for FW to | 1701 | * This function waits for up to MEGASAS_RESET_WAIT_TIME seconds for FW to |
1702 | * complete all its outstanding commands. Returns error if one or more IOs | 1702 | * complete all its outstanding commands. Returns error if one or more IOs |
1703 | * are pending after this time period. It also marks the controller dead. | 1703 | * are pending after this time period. It also marks the controller dead. |
1704 | */ | 1704 | */ |
diff --git a/drivers/scsi/mpt2sas/mpi/mpi2_init.h b/drivers/scsi/mpt2sas/mpi/mpi2_init.h index 20e6b8869341..165454d52591 100644 --- a/drivers/scsi/mpt2sas/mpi/mpi2_init.h +++ b/drivers/scsi/mpt2sas/mpi/mpi2_init.h | |||
@@ -21,7 +21,7 @@ | |||
21 | * 05-21-08 02.00.05 Fixed typo in name of Mpi2SepRequest_t. | 21 | * 05-21-08 02.00.05 Fixed typo in name of Mpi2SepRequest_t. |
22 | * 10-02-08 02.00.06 Removed Untagged and No Disconnect values from SCSI IO | 22 | * 10-02-08 02.00.06 Removed Untagged and No Disconnect values from SCSI IO |
23 | * Control field Task Attribute flags. | 23 | * Control field Task Attribute flags. |
24 | * Moved LUN field defines to mpi2.h becasue they are | 24 | * Moved LUN field defines to mpi2.h because they are |
25 | * common to many structures. | 25 | * common to many structures. |
26 | * 05-06-09 02.00.07 Changed task management type of Query Unit Attention to | 26 | * 05-06-09 02.00.07 Changed task management type of Query Unit Attention to |
27 | * Query Asynchronous Event. | 27 | * Query Asynchronous Event. |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index e8a6f1cf1e4b..3346357031e9 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c | |||
@@ -925,7 +925,7 @@ _base_interrupt(int irq, void *bus_id) | |||
925 | } | 925 | } |
926 | 926 | ||
927 | /** | 927 | /** |
928 | * mpt2sas_base_release_callback_handler - clear interupt callback handler | 928 | * mpt2sas_base_release_callback_handler - clear interrupt callback handler |
929 | * @cb_idx: callback index | 929 | * @cb_idx: callback index |
930 | * | 930 | * |
931 | * Return nothing. | 931 | * Return nothing. |
@@ -1113,7 +1113,7 @@ _base_restore_msix_table(struct MPT2SAS_ADAPTER *ioc) | |||
1113 | * @ioc: per adapter object | 1113 | * @ioc: per adapter object |
1114 | * | 1114 | * |
1115 | * Check to see if card is capable of MSIX, and set number | 1115 | * Check to see if card is capable of MSIX, and set number |
1116 | * of avaliable msix vectors | 1116 | * of available msix vectors |
1117 | */ | 1117 | */ |
1118 | static int | 1118 | static int |
1119 | _base_check_enable_msix(struct MPT2SAS_ADAPTER *ioc) | 1119 | _base_check_enable_msix(struct MPT2SAS_ADAPTER *ioc) |
@@ -1595,7 +1595,7 @@ mpt2sas_base_put_smid_scsi_io(struct MPT2SAS_ADAPTER *ioc, u16 smid, u16 handle) | |||
1595 | 1595 | ||
1596 | 1596 | ||
1597 | /** | 1597 | /** |
1598 | * mpt2sas_base_put_smid_hi_priority - send Task Managment request to firmware | 1598 | * mpt2sas_base_put_smid_hi_priority - send Task Management request to firmware |
1599 | * @ioc: per adapter object | 1599 | * @ioc: per adapter object |
1600 | * @smid: system request message index | 1600 | * @smid: system request message index |
1601 | * | 1601 | * |
@@ -1748,6 +1748,54 @@ _base_display_intel_branding(struct MPT2SAS_ADAPTER *ioc) | |||
1748 | } | 1748 | } |
1749 | 1749 | ||
1750 | /** | 1750 | /** |
1751 | * _base_display_hp_branding - Display branding string | ||
1752 | * @ioc: per adapter object | ||
1753 | * | ||
1754 | * Return nothing. | ||
1755 | */ | ||
1756 | static void | ||
1757 | _base_display_hp_branding(struct MPT2SAS_ADAPTER *ioc) | ||
1758 | { | ||
1759 | if (ioc->pdev->subsystem_vendor != MPT2SAS_HP_3PAR_SSVID) | ||
1760 | return; | ||
1761 | |||
1762 | switch (ioc->pdev->device) { | ||
1763 | case MPI2_MFGPAGE_DEVID_SAS2004: | ||
1764 | switch (ioc->pdev->subsystem_device) { | ||
1765 | case MPT2SAS_HP_DAUGHTER_2_4_INTERNAL_SSDID: | ||
1766 | printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, | ||
1767 | MPT2SAS_HP_DAUGHTER_2_4_INTERNAL_BRANDING); | ||
1768 | break; | ||
1769 | default: | ||
1770 | break; | ||
1771 | } | ||
1772 | case MPI2_MFGPAGE_DEVID_SAS2308_2: | ||
1773 | switch (ioc->pdev->subsystem_device) { | ||
1774 | case MPT2SAS_HP_2_4_INTERNAL_SSDID: | ||
1775 | printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, | ||
1776 | MPT2SAS_HP_2_4_INTERNAL_BRANDING); | ||
1777 | break; | ||
1778 | case MPT2SAS_HP_2_4_EXTERNAL_SSDID: | ||
1779 | printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, | ||
1780 | MPT2SAS_HP_2_4_EXTERNAL_BRANDING); | ||
1781 | break; | ||
1782 | case MPT2SAS_HP_1_4_INTERNAL_1_4_EXTERNAL_SSDID: | ||
1783 | printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, | ||
1784 | MPT2SAS_HP_1_4_INTERNAL_1_4_EXTERNAL_BRANDING); | ||
1785 | break; | ||
1786 | case MPT2SAS_HP_EMBEDDED_2_4_INTERNAL_SSDID: | ||
1787 | printk(MPT2SAS_INFO_FMT "%s\n", ioc->name, | ||
1788 | MPT2SAS_HP_EMBEDDED_2_4_INTERNAL_BRANDING); | ||
1789 | break; | ||
1790 | default: | ||
1791 | break; | ||
1792 | } | ||
1793 | default: | ||
1794 | break; | ||
1795 | } | ||
1796 | } | ||
1797 | |||
1798 | /** | ||
1751 | * _base_display_ioc_capabilities - Disply IOC's capabilities. | 1799 | * _base_display_ioc_capabilities - Disply IOC's capabilities. |
1752 | * @ioc: per adapter object | 1800 | * @ioc: per adapter object |
1753 | * | 1801 | * |
@@ -1778,6 +1826,7 @@ _base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc) | |||
1778 | 1826 | ||
1779 | _base_display_dell_branding(ioc); | 1827 | _base_display_dell_branding(ioc); |
1780 | _base_display_intel_branding(ioc); | 1828 | _base_display_intel_branding(ioc); |
1829 | _base_display_hp_branding(ioc); | ||
1781 | 1830 | ||
1782 | printk(MPT2SAS_INFO_FMT "Protocol=(", ioc->name); | 1831 | printk(MPT2SAS_INFO_FMT "Protocol=(", ioc->name); |
1783 | 1832 | ||
@@ -2550,7 +2599,7 @@ _base_wait_for_doorbell_int(struct MPT2SAS_ADAPTER *ioc, int timeout, | |||
2550 | int_status = readl(&ioc->chip->HostInterruptStatus); | 2599 | int_status = readl(&ioc->chip->HostInterruptStatus); |
2551 | if (int_status & MPI2_HIS_IOC2SYS_DB_STATUS) { | 2600 | if (int_status & MPI2_HIS_IOC2SYS_DB_STATUS) { |
2552 | dhsprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: " | 2601 | dhsprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: " |
2553 | "successfull count(%d), timeout(%d)\n", ioc->name, | 2602 | "successful count(%d), timeout(%d)\n", ioc->name, |
2554 | __func__, count, timeout)); | 2603 | __func__, count, timeout)); |
2555 | return 0; | 2604 | return 0; |
2556 | } | 2605 | } |
@@ -2591,7 +2640,7 @@ _base_wait_for_doorbell_ack(struct MPT2SAS_ADAPTER *ioc, int timeout, | |||
2591 | int_status = readl(&ioc->chip->HostInterruptStatus); | 2640 | int_status = readl(&ioc->chip->HostInterruptStatus); |
2592 | if (!(int_status & MPI2_HIS_SYS2IOC_DB_STATUS)) { | 2641 | if (!(int_status & MPI2_HIS_SYS2IOC_DB_STATUS)) { |
2593 | dhsprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: " | 2642 | dhsprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: " |
2594 | "successfull count(%d), timeout(%d)\n", ioc->name, | 2643 | "successful count(%d), timeout(%d)\n", ioc->name, |
2595 | __func__, count, timeout)); | 2644 | __func__, count, timeout)); |
2596 | return 0; | 2645 | return 0; |
2597 | } else if (int_status & MPI2_HIS_IOC2SYS_DB_STATUS) { | 2646 | } else if (int_status & MPI2_HIS_IOC2SYS_DB_STATUS) { |
@@ -2639,7 +2688,7 @@ _base_wait_for_doorbell_not_used(struct MPT2SAS_ADAPTER *ioc, int timeout, | |||
2639 | doorbell_reg = readl(&ioc->chip->Doorbell); | 2688 | doorbell_reg = readl(&ioc->chip->Doorbell); |
2640 | if (!(doorbell_reg & MPI2_DOORBELL_USED)) { | 2689 | if (!(doorbell_reg & MPI2_DOORBELL_USED)) { |
2641 | dhsprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: " | 2690 | dhsprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: " |
2642 | "successfull count(%d), timeout(%d)\n", ioc->name, | 2691 | "successful count(%d), timeout(%d)\n", ioc->name, |
2643 | __func__, count, timeout)); | 2692 | __func__, count, timeout)); |
2644 | return 0; | 2693 | return 0; |
2645 | } | 2694 | } |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.h b/drivers/scsi/mpt2sas/mpt2sas_base.h index a3f8aa9baea4..500328245f61 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.h +++ b/drivers/scsi/mpt2sas/mpt2sas_base.h | |||
@@ -168,6 +168,26 @@ | |||
168 | #define MPT2SAS_INTEL_RMS2LL080_SSDID 0x350E | 168 | #define MPT2SAS_INTEL_RMS2LL080_SSDID 0x350E |
169 | #define MPT2SAS_INTEL_RMS2LL040_SSDID 0x350F | 169 | #define MPT2SAS_INTEL_RMS2LL040_SSDID 0x350F |
170 | 170 | ||
171 | |||
172 | /* | ||
173 | * HP HBA branding | ||
174 | */ | ||
175 | #define MPT2SAS_HP_3PAR_SSVID 0x1590 | ||
176 | #define MPT2SAS_HP_2_4_INTERNAL_BRANDING "HP H220 Host Bus Adapter" | ||
177 | #define MPT2SAS_HP_2_4_EXTERNAL_BRANDING "HP H221 Host Bus Adapter" | ||
178 | #define MPT2SAS_HP_1_4_INTERNAL_1_4_EXTERNAL_BRANDING "HP H222 Host Bus Adapter" | ||
179 | #define MPT2SAS_HP_EMBEDDED_2_4_INTERNAL_BRANDING "HP H220i Host Bus Adapter" | ||
180 | #define MPT2SAS_HP_DAUGHTER_2_4_INTERNAL_BRANDING "HP H210i Host Bus Adapter" | ||
181 | |||
182 | /* | ||
183 | * HO HBA SSDIDs | ||
184 | */ | ||
185 | #define MPT2SAS_HP_2_4_INTERNAL_SSDID 0x0041 | ||
186 | #define MPT2SAS_HP_2_4_EXTERNAL_SSDID 0x0042 | ||
187 | #define MPT2SAS_HP_1_4_INTERNAL_1_4_EXTERNAL_SSDID 0x0043 | ||
188 | #define MPT2SAS_HP_EMBEDDED_2_4_INTERNAL_SSDID 0x0044 | ||
189 | #define MPT2SAS_HP_DAUGHTER_2_4_INTERNAL_SSDID 0x0046 | ||
190 | |||
171 | /* | 191 | /* |
172 | * per target private data | 192 | * per target private data |
173 | */ | 193 | */ |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_config.c b/drivers/scsi/mpt2sas/mpt2sas_config.c index 6afd67b324fe..6861244249a3 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_config.c +++ b/drivers/scsi/mpt2sas/mpt2sas_config.c | |||
@@ -93,7 +93,7 @@ struct config_request{ | |||
93 | * @mpi_reply: reply message frame | 93 | * @mpi_reply: reply message frame |
94 | * Context: none. | 94 | * Context: none. |
95 | * | 95 | * |
96 | * Function for displaying debug info helpfull when debugging issues | 96 | * Function for displaying debug info helpful when debugging issues |
97 | * in this module. | 97 | * in this module. |
98 | */ | 98 | */ |
99 | static void | 99 | static void |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_ctl.c b/drivers/scsi/mpt2sas/mpt2sas_ctl.c index e92b77af5484..1c6d2b405eef 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_ctl.c +++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c | |||
@@ -116,7 +116,7 @@ _ctl_sas_device_find_by_handle(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
116 | * @mpi_reply: reply message frame | 116 | * @mpi_reply: reply message frame |
117 | * Context: none. | 117 | * Context: none. |
118 | * | 118 | * |
119 | * Function for displaying debug info helpfull when debugging issues | 119 | * Function for displaying debug info helpful when debugging issues |
120 | * in this module. | 120 | * in this module. |
121 | */ | 121 | */ |
122 | static void | 122 | static void |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 6ceb7759bfe5..d2064a0533ae 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | |||
@@ -397,7 +397,7 @@ _scsih_get_sas_address(struct MPT2SAS_ADAPTER *ioc, u16 handle, | |||
397 | * @is_raid: [flag] 1 = raid object, 0 = sas object | 397 | * @is_raid: [flag] 1 = raid object, 0 = sas object |
398 | * | 398 | * |
399 | * Determines whether this device should be first reported device to | 399 | * Determines whether this device should be first reported device to |
400 | * to scsi-ml or sas transport, this purpose is for persistant boot device. | 400 | * to scsi-ml or sas transport, this purpose is for persistent boot device. |
401 | * There are primary, alternate, and current entries in bios page 2. The order | 401 | * There are primary, alternate, and current entries in bios page 2. The order |
402 | * priority is primary, alternate, then current. This routine saves | 402 | * priority is primary, alternate, then current. This routine saves |
403 | * the corresponding device object and is_raid flag in the ioc object. | 403 | * the corresponding device object and is_raid flag in the ioc object. |
@@ -2671,10 +2671,10 @@ _scsih_block_io_to_children_attached_directly(struct MPT2SAS_ADAPTER *ioc, | |||
2671 | * @handle: device handle | 2671 | * @handle: device handle |
2672 | * Context: interrupt time. | 2672 | * Context: interrupt time. |
2673 | * | 2673 | * |
2674 | * This code is to initiate the device removal handshake protocal | 2674 | * This code is to initiate the device removal handshake protocol |
2675 | * with controller firmware. This function will issue target reset | 2675 | * with controller firmware. This function will issue target reset |
2676 | * using high priority request queue. It will send a sas iounit | 2676 | * using high priority request queue. It will send a sas iounit |
2677 | * controll request (MPI2_SAS_OP_REMOVE_DEVICE) from this completion. | 2677 | * control request (MPI2_SAS_OP_REMOVE_DEVICE) from this completion. |
2678 | * | 2678 | * |
2679 | * This is designed to send muliple task management request at the same | 2679 | * This is designed to send muliple task management request at the same |
2680 | * time to the fifo. If the fifo is full, we will append the request, | 2680 | * time to the fifo. If the fifo is full, we will append the request, |
@@ -2749,9 +2749,9 @@ _scsih_tm_tr_send(struct MPT2SAS_ADAPTER *ioc, u16 handle) | |||
2749 | * @reply: reply message frame(lower 32bit addr) | 2749 | * @reply: reply message frame(lower 32bit addr) |
2750 | * Context: interrupt time. | 2750 | * Context: interrupt time. |
2751 | * | 2751 | * |
2752 | * This is the sas iounit controll completion routine. | 2752 | * This is the sas iounit control completion routine. |
2753 | * This code is part of the code to initiate the device removal | 2753 | * This code is part of the code to initiate the device removal |
2754 | * handshake protocal with controller firmware. | 2754 | * handshake protocol with controller firmware. |
2755 | * | 2755 | * |
2756 | * Return 1 meaning mf should be freed from _base_interrupt | 2756 | * Return 1 meaning mf should be freed from _base_interrupt |
2757 | * 0 means the mf is freed from this function. | 2757 | * 0 means the mf is freed from this function. |
@@ -2878,8 +2878,8 @@ _scsih_tm_volume_tr_complete(struct MPT2SAS_ADAPTER *ioc, u16 smid, | |||
2878 | * | 2878 | * |
2879 | * This is the target reset completion routine. | 2879 | * This is the target reset completion routine. |
2880 | * This code is part of the code to initiate the device removal | 2880 | * This code is part of the code to initiate the device removal |
2881 | * handshake protocal with controller firmware. | 2881 | * handshake protocol with controller firmware. |
2882 | * It will send a sas iounit controll request (MPI2_SAS_OP_REMOVE_DEVICE) | 2882 | * It will send a sas iounit control request (MPI2_SAS_OP_REMOVE_DEVICE) |
2883 | * | 2883 | * |
2884 | * Return 1 meaning mf should be freed from _base_interrupt | 2884 | * Return 1 meaning mf should be freed from _base_interrupt |
2885 | * 0 means the mf is freed from this function. | 2885 | * 0 means the mf is freed from this function. |
@@ -2984,7 +2984,7 @@ _scsih_check_for_pending_tm(struct MPT2SAS_ADAPTER *ioc, u16 smid) | |||
2984 | * | 2984 | * |
2985 | * This routine added to better handle cable breaker. | 2985 | * This routine added to better handle cable breaker. |
2986 | * | 2986 | * |
2987 | * This handles the case where driver recieves multiple expander | 2987 | * This handles the case where driver receives multiple expander |
2988 | * add and delete events in a single shot. When there is a delete event | 2988 | * add and delete events in a single shot. When there is a delete event |
2989 | * the routine will void any pending add events waiting in the event queue. | 2989 | * the routine will void any pending add events waiting in the event queue. |
2990 | * | 2990 | * |
@@ -3511,7 +3511,7 @@ _scsih_normalize_sense(char *sense_buffer, struct sense_info *data) | |||
3511 | 3511 | ||
3512 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING | 3512 | #ifdef CONFIG_SCSI_MPT2SAS_LOGGING |
3513 | /** | 3513 | /** |
3514 | * _scsih_scsi_ioc_info - translated non-successfull SCSI_IO request | 3514 | * _scsih_scsi_ioc_info - translated non-successful SCSI_IO request |
3515 | * @ioc: per adapter object | 3515 | * @ioc: per adapter object |
3516 | * @scmd: pointer to scsi command object | 3516 | * @scmd: pointer to scsi command object |
3517 | * @mpi_reply: reply mf payload returned from firmware | 3517 | * @mpi_reply: reply mf payload returned from firmware |
@@ -5138,7 +5138,7 @@ _scsih_sas_broadcast_primative_event(struct MPT2SAS_ADAPTER *ioc, | |||
5138 | unsigned long flags; | 5138 | unsigned long flags; |
5139 | int r; | 5139 | int r; |
5140 | 5140 | ||
5141 | dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "broadcast primative: " | 5141 | dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "broadcast primitive: " |
5142 | "phy number(%d), width(%d)\n", ioc->name, event_data->PhyNum, | 5142 | "phy number(%d), width(%d)\n", ioc->name, event_data->PhyNum, |
5143 | event_data->PortWidth)); | 5143 | event_data->PortWidth)); |
5144 | dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter\n", ioc->name, | 5144 | dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter\n", ioc->name, |
diff --git a/drivers/scsi/mvsas/Makefile b/drivers/scsi/mvsas/Makefile index 52ac4264677d..ffbf759e46f1 100644 --- a/drivers/scsi/mvsas/Makefile +++ b/drivers/scsi/mvsas/Makefile | |||
@@ -21,9 +21,7 @@ | |||
21 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | 21 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 |
22 | # USA | 22 | # USA |
23 | 23 | ||
24 | ifeq ($(CONFIG_SCSI_MVSAS_DEBUG),y) | 24 | ccflags-$(CONFIG_SCSI_MVSAS_DEBUG) := -DMV_DEBUG |
25 | EXTRA_CFLAGS += -DMV_DEBUG | ||
26 | endif | ||
27 | 25 | ||
28 | obj-$(CONFIG_SCSI_MVSAS) += mvsas.o | 26 | obj-$(CONFIG_SCSI_MVSAS) += mvsas.o |
29 | mvsas-y += mv_init.o \ | 27 | mvsas-y += mv_init.o \ |
diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c index 19ad34f381a5..938d045e4180 100644 --- a/drivers/scsi/mvsas/mv_init.c +++ b/drivers/scsi/mvsas/mv_init.c | |||
@@ -663,6 +663,13 @@ static struct pci_device_id __devinitdata mvs_pci_table[] = { | |||
663 | { PCI_VDEVICE(ARECA, PCI_DEVICE_ID_ARECA_1300), chip_1300 }, | 663 | { PCI_VDEVICE(ARECA, PCI_DEVICE_ID_ARECA_1300), chip_1300 }, |
664 | { PCI_VDEVICE(ARECA, PCI_DEVICE_ID_ARECA_1320), chip_1320 }, | 664 | { PCI_VDEVICE(ARECA, PCI_DEVICE_ID_ARECA_1320), chip_1320 }, |
665 | { PCI_VDEVICE(ADAPTEC2, 0x0450), chip_6440 }, | 665 | { PCI_VDEVICE(ADAPTEC2, 0x0450), chip_6440 }, |
666 | { PCI_VDEVICE(TTI, 0x2710), chip_9480 }, | ||
667 | { PCI_VDEVICE(TTI, 0x2720), chip_9480 }, | ||
668 | { PCI_VDEVICE(TTI, 0x2721), chip_9480 }, | ||
669 | { PCI_VDEVICE(TTI, 0x2722), chip_9480 }, | ||
670 | { PCI_VDEVICE(TTI, 0x2740), chip_9480 }, | ||
671 | { PCI_VDEVICE(TTI, 0x2744), chip_9480 }, | ||
672 | { PCI_VDEVICE(TTI, 0x2760), chip_9480 }, | ||
666 | 673 | ||
667 | { } /* terminate list */ | 674 | { } /* terminate list */ |
668 | }; | 675 | }; |
diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c index 46cc3825638d..835d8d66e696 100644 --- a/drivers/scsi/ncr53c8xx.c +++ b/drivers/scsi/ncr53c8xx.c | |||
@@ -2679,7 +2679,7 @@ static struct script script0 __initdata = { | |||
2679 | }/*-------------------------< RESEL_TAG >-------------------*/,{ | 2679 | }/*-------------------------< RESEL_TAG >-------------------*/,{ |
2680 | /* | 2680 | /* |
2681 | ** Read IDENTIFY + SIMPLE + TAG using a single MOVE. | 2681 | ** Read IDENTIFY + SIMPLE + TAG using a single MOVE. |
2682 | ** Agressive optimization, is'nt it? | 2682 | ** Aggressive optimization, is'nt it? |
2683 | ** No need to test the SIMPLE TAG message, since the | 2683 | ** No need to test the SIMPLE TAG message, since the |
2684 | ** driver only supports conformant devices for tags. ;-) | 2684 | ** driver only supports conformant devices for tags. ;-) |
2685 | */ | 2685 | */ |
diff --git a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c index 6b8b021400f8..f6a50c98c36f 100644 --- a/drivers/scsi/nsp32.c +++ b/drivers/scsi/nsp32.c | |||
@@ -1288,7 +1288,7 @@ static irqreturn_t do_nsp32_isr(int irq, void *dev_id) | |||
1288 | nsp32_dbg(NSP32_DEBUG_INTR, "SSACK=0x%lx", | 1288 | nsp32_dbg(NSP32_DEBUG_INTR, "SSACK=0x%lx", |
1289 | nsp32_read4(base, SAVED_SACK_CNT)); | 1289 | nsp32_read4(base, SAVED_SACK_CNT)); |
1290 | 1290 | ||
1291 | scsi_set_resid(SCpnt, 0); /* all data transfered! */ | 1291 | scsi_set_resid(SCpnt, 0); /* all data transferred! */ |
1292 | } | 1292 | } |
1293 | 1293 | ||
1294 | /* | 1294 | /* |
@@ -1630,7 +1630,7 @@ static int nsp32_busfree_occur(struct scsi_cmnd *SCpnt, unsigned short execph) | |||
1630 | 1630 | ||
1631 | /* | 1631 | /* |
1632 | * If SAVEDSACKCNT == 0, it means SavedDataPointer is | 1632 | * If SAVEDSACKCNT == 0, it means SavedDataPointer is |
1633 | * come after data transfering. | 1633 | * come after data transferring. |
1634 | */ | 1634 | */ |
1635 | if (s_sacklen > 0) { | 1635 | if (s_sacklen > 0) { |
1636 | /* | 1636 | /* |
@@ -1785,7 +1785,7 @@ static void nsp32_adjust_busfree(struct scsi_cmnd *SCpnt, unsigned int s_sacklen | |||
1785 | the head element of the sg. restlen is correctly calculated. */ | 1785 | the head element of the sg. restlen is correctly calculated. */ |
1786 | } | 1786 | } |
1787 | 1787 | ||
1788 | /* calculate the rest length for transfering */ | 1788 | /* calculate the rest length for transferring */ |
1789 | restlen = sentlen - s_sacklen; | 1789 | restlen = sentlen - s_sacklen; |
1790 | 1790 | ||
1791 | /* update adjusting current SG table entry */ | 1791 | /* update adjusting current SG table entry */ |
diff --git a/drivers/scsi/nsp32.h b/drivers/scsi/nsp32.h index 9565acf1aa72..c0221829069c 100644 --- a/drivers/scsi/nsp32.h +++ b/drivers/scsi/nsp32.h | |||
@@ -507,7 +507,7 @@ typedef struct _nsp32_lunt { | |||
507 | /* | 507 | /* |
508 | * SCSI TARGET/LUN definition | 508 | * SCSI TARGET/LUN definition |
509 | */ | 509 | */ |
510 | #define NSP32_HOST_SCSIID 7 /* SCSI initiator is everytime defined as 7 */ | 510 | #define NSP32_HOST_SCSIID 7 /* SCSI initiator is every time defined as 7 */ |
511 | #define MAX_TARGET 8 | 511 | #define MAX_TARGET 8 |
512 | #define MAX_LUN 8 /* XXX: In SPI3, max number of LUN is 64. */ | 512 | #define MAX_LUN 8 /* XXX: In SPI3, max number of LUN is 64. */ |
513 | 513 | ||
diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c index 521e2182d45b..58f5be4740e9 100644 --- a/drivers/scsi/osst.c +++ b/drivers/scsi/osst.c | |||
@@ -1366,7 +1366,7 @@ error: | |||
1366 | /* The values below are based on the OnStream frame payload size of 32K == 2**15, | 1366 | /* The values below are based on the OnStream frame payload size of 32K == 2**15, |
1367 | * that is, OSST_FRAME_SHIFT + OSST_SECTOR_SHIFT must be 15. With a minimum block | 1367 | * that is, OSST_FRAME_SHIFT + OSST_SECTOR_SHIFT must be 15. With a minimum block |
1368 | * size of 512 bytes, we need to be able to resolve 32K/512 == 64 == 2**6 positions | 1368 | * size of 512 bytes, we need to be able to resolve 32K/512 == 64 == 2**6 positions |
1369 | * inside each frame. Finaly, OSST_SECTOR_MASK == 2**OSST_FRAME_SHIFT - 1. | 1369 | * inside each frame. Finally, OSST_SECTOR_MASK == 2**OSST_FRAME_SHIFT - 1. |
1370 | */ | 1370 | */ |
1371 | #define OSST_FRAME_SHIFT 6 | 1371 | #define OSST_FRAME_SHIFT 6 |
1372 | #define OSST_SECTOR_SHIFT 9 | 1372 | #define OSST_SECTOR_SHIFT 9 |
@@ -3131,7 +3131,7 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** | |||
3131 | } | 3131 | } |
3132 | #if DEBUG | 3132 | #if DEBUG |
3133 | if (debugging) | 3133 | if (debugging) |
3134 | printk(OSST_DEB_MSG "%s:D: Flushing %d bytes, Transfering %d bytes in %d lblocks.\n", | 3134 | printk(OSST_DEB_MSG "%s:D: Flushing %d bytes, Transferring %d bytes in %d lblocks.\n", |
3135 | name, offset, transfer, blks); | 3135 | name, offset, transfer, blks); |
3136 | #endif | 3136 | #endif |
3137 | 3137 | ||
@@ -3811,7 +3811,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo | |||
3811 | 3811 | ||
3812 | if (transfer == 0) { | 3812 | if (transfer == 0) { |
3813 | printk(KERN_WARNING | 3813 | printk(KERN_WARNING |
3814 | "%s:W: Nothing can be transfered, requested %Zd, tape block size (%d%c).\n", | 3814 | "%s:W: Nothing can be transferred, requested %Zd, tape block size (%d%c).\n", |
3815 | name, count, STp->block_size < 1024? | 3815 | name, count, STp->block_size < 1024? |
3816 | STp->block_size:STp->block_size/1024, | 3816 | STp->block_size:STp->block_size/1024, |
3817 | STp->block_size<1024?'b':'k'); | 3817 | STp->block_size<1024?'b':'k'); |
diff --git a/drivers/scsi/osst.h b/drivers/scsi/osst.h index 11d26c57f3f8..b4fea98ba276 100644 --- a/drivers/scsi/osst.h +++ b/drivers/scsi/osst.h | |||
@@ -413,7 +413,7 @@ typedef struct os_dat_s { | |||
413 | * AUX | 413 | * AUX |
414 | */ | 414 | */ |
415 | typedef struct os_aux_s { | 415 | typedef struct os_aux_s { |
416 | __be32 format_id; /* hardware compability AUX is based on */ | 416 | __be32 format_id; /* hardware compatibility AUX is based on */ |
417 | char application_sig[4]; /* driver used to write this media */ | 417 | char application_sig[4]; /* driver used to write this media */ |
418 | __be32 hdwr; /* reserved */ | 418 | __be32 hdwr; /* reserved */ |
419 | __be32 update_frame_cntr; /* for configuration frame */ | 419 | __be32 update_frame_cntr; /* for configuration frame */ |
diff --git a/drivers/scsi/pcmcia/Makefile b/drivers/scsi/pcmcia/Makefile index eca379059db6..683bf148b5b7 100644 --- a/drivers/scsi/pcmcia/Makefile +++ b/drivers/scsi/pcmcia/Makefile | |||
@@ -1,5 +1,5 @@ | |||
1 | 1 | ||
2 | EXTRA_CFLAGS += -Idrivers/scsi | 2 | ccflags-y := -Idrivers/scsi |
3 | 3 | ||
4 | # 16-bit client drivers | 4 | # 16-bit client drivers |
5 | obj-$(CONFIG_PCMCIA_QLOGIC) += qlogic_cs.o | 5 | obj-$(CONFIG_PCMCIA_QLOGIC) += qlogic_cs.o |
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index be3f33d31a99..54bdf6d85c6d 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c | |||
@@ -742,7 +742,7 @@ static void nsp_pio_read(struct scsi_cmnd *SCpnt) | |||
742 | 742 | ||
743 | res = nsp_fifo_count(SCpnt) - ocount; | 743 | res = nsp_fifo_count(SCpnt) - ocount; |
744 | //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res); | 744 | //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res); |
745 | if (res == 0) { /* if some data avilable ? */ | 745 | if (res == 0) { /* if some data available ? */ |
746 | if (stat == BUSPHASE_DATA_IN) { /* phase changed? */ | 746 | if (stat == BUSPHASE_DATA_IN) { /* phase changed? */ |
747 | //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual); | 747 | //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual); |
748 | continue; | 748 | continue; |
diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c index 18b6c55cd08c..8b7db1e53c10 100644 --- a/drivers/scsi/pm8001/pm8001_hwi.c +++ b/drivers/scsi/pm8001/pm8001_hwi.c | |||
@@ -339,7 +339,7 @@ update_outbnd_queue_table(struct pm8001_hba_info *pm8001_ha, int number) | |||
339 | 339 | ||
340 | /** | 340 | /** |
341 | * bar4_shift - function is called to shift BAR base address | 341 | * bar4_shift - function is called to shift BAR base address |
342 | * @pm8001_ha : our hba card infomation | 342 | * @pm8001_ha : our hba card information |
343 | * @shiftValue : shifting value in memory bar. | 343 | * @shiftValue : shifting value in memory bar. |
344 | */ | 344 | */ |
345 | static int bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue) | 345 | static int bar4_shift(struct pm8001_hba_info *pm8001_ha, u32 shiftValue) |
diff --git a/drivers/scsi/pm8001/pm8001_hwi.h b/drivers/scsi/pm8001/pm8001_hwi.h index 833a5201eda4..909132041c07 100644 --- a/drivers/scsi/pm8001/pm8001_hwi.h +++ b/drivers/scsi/pm8001/pm8001_hwi.h | |||
@@ -209,7 +209,7 @@ struct pio_setup_fis { | |||
209 | 209 | ||
210 | /* | 210 | /* |
211 | * brief the data structure of SATA Completion Response | 211 | * brief the data structure of SATA Completion Response |
212 | * use to discribe the sata task response (64 bytes) | 212 | * use to describe the sata task response (64 bytes) |
213 | */ | 213 | */ |
214 | struct sata_completion_resp { | 214 | struct sata_completion_resp { |
215 | __le32 tag; | 215 | __le32 tag; |
@@ -951,7 +951,7 @@ struct set_dev_state_resp { | |||
951 | #define PCIE_EVENT_INTERRUPT 0x003044 | 951 | #define PCIE_EVENT_INTERRUPT 0x003044 |
952 | #define PCIE_ERROR_INTERRUPT_ENABLE 0x003048 | 952 | #define PCIE_ERROR_INTERRUPT_ENABLE 0x003048 |
953 | #define PCIE_ERROR_INTERRUPT 0x00304C | 953 | #define PCIE_ERROR_INTERRUPT 0x00304C |
954 | /* signature defintion for host scratch pad0 register */ | 954 | /* signature definition for host scratch pad0 register */ |
955 | #define SPC_SOFT_RESET_SIGNATURE 0x252acbcd | 955 | #define SPC_SOFT_RESET_SIGNATURE 0x252acbcd |
956 | /* Signature for Soft Reset */ | 956 | /* Signature for Soft Reset */ |
957 | 957 | ||
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h index bdb6b27dedd6..aa05e661d113 100644 --- a/drivers/scsi/pm8001/pm8001_sas.h +++ b/drivers/scsi/pm8001/pm8001_sas.h | |||
@@ -445,7 +445,7 @@ struct fw_control_info { | |||
445 | struct fw_control_ex { | 445 | struct fw_control_ex { |
446 | struct fw_control_info *fw_control; | 446 | struct fw_control_info *fw_control; |
447 | void *buffer;/* keep buffer pointer to be | 447 | void *buffer;/* keep buffer pointer to be |
448 | freed when the responce comes*/ | 448 | freed when the response comes*/ |
449 | void *virtAddr;/* keep virtual address of the data */ | 449 | void *virtAddr;/* keep virtual address of the data */ |
450 | void *usrAddr;/* keep virtual address of the | 450 | void *usrAddr;/* keep virtual address of the |
451 | user data */ | 451 | user data */ |
diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c index bcf858e88c64..96d5ad0c1e42 100644 --- a/drivers/scsi/pmcraid.c +++ b/drivers/scsi/pmcraid.c | |||
@@ -213,7 +213,7 @@ static int pmcraid_slave_alloc(struct scsi_device *scsi_dev) | |||
213 | * pmcraid_slave_configure - Configures a SCSI device | 213 | * pmcraid_slave_configure - Configures a SCSI device |
214 | * @scsi_dev: scsi device struct | 214 | * @scsi_dev: scsi device struct |
215 | * | 215 | * |
216 | * This fucntion is executed by SCSI mid layer just after a device is first | 216 | * This function is executed by SCSI mid layer just after a device is first |
217 | * scanned (i.e. it has responded to an INQUIRY). For VSET resources, the | 217 | * scanned (i.e. it has responded to an INQUIRY). For VSET resources, the |
218 | * timeout value (default 30s) will be over-written to a higher value (60s) | 218 | * timeout value (default 30s) will be over-written to a higher value (60s) |
219 | * and max_sectors value will be over-written to 512. It also sets queue depth | 219 | * and max_sectors value will be over-written to 512. It also sets queue depth |
@@ -2122,7 +2122,7 @@ static void pmcraid_fail_outstanding_cmds(struct pmcraid_instance *pinstance) | |||
2122 | * | 2122 | * |
2123 | * This function executes most of the steps required for IOA reset. This gets | 2123 | * This function executes most of the steps required for IOA reset. This gets |
2124 | * called by user threads (modprobe/insmod/rmmod) timer, tasklet and midlayer's | 2124 | * called by user threads (modprobe/insmod/rmmod) timer, tasklet and midlayer's |
2125 | * 'eh_' thread. Access to variables used for controling the reset sequence is | 2125 | * 'eh_' thread. Access to variables used for controlling the reset sequence is |
2126 | * synchronized using host lock. Various functions called during reset process | 2126 | * synchronized using host lock. Various functions called during reset process |
2127 | * would make use of a single command block, pointer to which is also stored in | 2127 | * would make use of a single command block, pointer to which is also stored in |
2128 | * adapter instance structure. | 2128 | * adapter instance structure. |
@@ -2994,7 +2994,7 @@ static int pmcraid_abort_complete(struct pmcraid_cmd *cancel_cmd) | |||
2994 | 2994 | ||
2995 | /* If the abort task is not timed out we will get a Good completion | 2995 | /* If the abort task is not timed out we will get a Good completion |
2996 | * as sense_key, otherwise we may get one the following responses | 2996 | * as sense_key, otherwise we may get one the following responses |
2997 | * due to subsquent bus reset or device reset. In case IOASC is | 2997 | * due to subsequent bus reset or device reset. In case IOASC is |
2998 | * NR_SYNC_REQUIRED, set sync_reqd flag for the corresponding resource | 2998 | * NR_SYNC_REQUIRED, set sync_reqd flag for the corresponding resource |
2999 | */ | 2999 | */ |
3000 | if (ioasc == PMCRAID_IOASC_UA_BUS_WAS_RESET || | 3000 | if (ioasc == PMCRAID_IOASC_UA_BUS_WAS_RESET || |
@@ -3933,7 +3933,7 @@ static long pmcraid_ioctl_passthrough( | |||
3933 | 3933 | ||
3934 | /* if abort task couldn't find the command i.e it got | 3934 | /* if abort task couldn't find the command i.e it got |
3935 | * completed prior to aborting, return good completion. | 3935 | * completed prior to aborting, return good completion. |
3936 | * if command got aborted succesfully or there was IOA | 3936 | * if command got aborted successfully or there was IOA |
3937 | * reset due to abort task itself getting timedout then | 3937 | * reset due to abort task itself getting timedout then |
3938 | * return -ETIMEDOUT | 3938 | * return -ETIMEDOUT |
3939 | */ | 3939 | */ |
@@ -5932,7 +5932,7 @@ static int __devinit pmcraid_probe( | |||
5932 | * However, firmware supports 64-bit streaming DMA buffers, whereas | 5932 | * However, firmware supports 64-bit streaming DMA buffers, whereas |
5933 | * coherent buffers are to be 32-bit. Since pci_alloc_consistent always | 5933 | * coherent buffers are to be 32-bit. Since pci_alloc_consistent always |
5934 | * returns memory within 4GB (if not, change this logic), coherent | 5934 | * returns memory within 4GB (if not, change this logic), coherent |
5935 | * buffers are within firmware acceptible address ranges. | 5935 | * buffers are within firmware acceptable address ranges. |
5936 | */ | 5936 | */ |
5937 | if ((sizeof(dma_addr_t) == 4) || | 5937 | if ((sizeof(dma_addr_t) == 4) || |
5938 | pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) | 5938 | pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) |
diff --git a/drivers/scsi/pmcraid.h b/drivers/scsi/pmcraid.h index 4db210d93947..34e4c915002e 100644 --- a/drivers/scsi/pmcraid.h +++ b/drivers/scsi/pmcraid.h | |||
@@ -1024,7 +1024,7 @@ static struct pmcraid_ioasc_error pmcraid_ioasc_error_table[] = { | |||
1024 | 1024 | ||
1025 | 1025 | ||
1026 | /* | 1026 | /* |
1027 | * pmcraid_ioctl_header - definition of header structure that preceeds all the | 1027 | * pmcraid_ioctl_header - definition of header structure that precedes all the |
1028 | * buffers given as ioctl arguments. | 1028 | * buffers given as ioctl arguments. |
1029 | * | 1029 | * |
1030 | * .signature : always ASCII string, "PMCRAID" | 1030 | * .signature : always ASCII string, "PMCRAID" |
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index 5dec684bf010..8ba5744c267e 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c | |||
@@ -78,7 +78,7 @@ | |||
78 | - Clean up vchan handling | 78 | - Clean up vchan handling |
79 | Rev 3.23.33 July 3, 2003, Jes Sorensen | 79 | Rev 3.23.33 July 3, 2003, Jes Sorensen |
80 | - Don't define register access macros before define determining MMIO. | 80 | - Don't define register access macros before define determining MMIO. |
81 | This just happend to work out on ia64 but not elsewhere. | 81 | This just happened to work out on ia64 but not elsewhere. |
82 | - Don't try and read from the card while it is in reset as | 82 | - Don't try and read from the card while it is in reset as |
83 | it won't respond and causes an MCA | 83 | it won't respond and causes an MCA |
84 | Rev 3.23.32 June 23, 2003, Jes Sorensen | 84 | Rev 3.23.32 June 23, 2003, Jes Sorensen |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 6c51c0a35b9e..ee20353c8550 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -2086,7 +2086,7 @@ struct ct_sns_pkt { | |||
2086 | }; | 2086 | }; |
2087 | 2087 | ||
2088 | /* | 2088 | /* |
2089 | * SNS command structures -- for 2200 compatability. | 2089 | * SNS command structures -- for 2200 compatibility. |
2090 | */ | 2090 | */ |
2091 | #define RFT_ID_SNS_SCMD_LEN 22 | 2091 | #define RFT_ID_SNS_SCMD_LEN 22 |
2092 | #define RFT_ID_SNS_CMD_SIZE 60 | 2092 | #define RFT_ID_SNS_CMD_SIZE 60 |
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index 631fefc8482d..f5ba09c8a663 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h | |||
@@ -539,7 +539,7 @@ struct sts_entry_24xx { | |||
539 | * If DIF Error is set in comp_status, these additional fields are | 539 | * If DIF Error is set in comp_status, these additional fields are |
540 | * defined: | 540 | * defined: |
541 | * &data[10] : uint8_t report_runt_bg[2]; - computed guard | 541 | * &data[10] : uint8_t report_runt_bg[2]; - computed guard |
542 | * &data[12] : uint8_t actual_dif[8]; - DIF Data recieved | 542 | * &data[12] : uint8_t actual_dif[8]; - DIF Data received |
543 | * &data[20] : uint8_t expected_dif[8]; - DIF Data computed | 543 | * &data[20] : uint8_t expected_dif[8]; - DIF Data computed |
544 | */ | 544 | */ |
545 | }; | 545 | }; |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 8b4d99a224f3..6c55c3ca8e05 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -414,7 +414,7 @@ skip_rio: | |||
414 | "marked OFFLINE!\n"); | 414 | "marked OFFLINE!\n"); |
415 | vha->flags.online = 0; | 415 | vha->flags.online = 0; |
416 | } else { | 416 | } else { |
417 | /* Check to see if MPI timeout occured */ | 417 | /* Check to see if MPI timeout occurred */ |
418 | if ((mbx & MBX_3) && (ha->flags.port0)) | 418 | if ((mbx & MBX_3) && (ha->flags.port0)) |
419 | set_bit(MPI_RESET_NEEDED, | 419 | set_bit(MPI_RESET_NEEDED, |
420 | &vha->dpc_flags); | 420 | &vha->dpc_flags); |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 7a7c0ecfe7dd..34893397ac84 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -303,7 +303,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
303 | !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) { | 303 | !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) { |
304 | 304 | ||
305 | qla_printk(KERN_WARNING, ha, | 305 | qla_printk(KERN_WARNING, ha, |
306 | "Mailbox command timeout occured. " | 306 | "Mailbox command timeout occurred. " |
307 | "Scheduling ISP " "abort. eeh_busy: 0x%x\n", | 307 | "Scheduling ISP " "abort. eeh_busy: 0x%x\n", |
308 | ha->flags.eeh_busy); | 308 | ha->flags.eeh_busy); |
309 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); | 309 | set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); |
@@ -321,7 +321,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
321 | !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) { | 321 | !test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) { |
322 | 322 | ||
323 | qla_printk(KERN_WARNING, ha, | 323 | qla_printk(KERN_WARNING, ha, |
324 | "Mailbox command timeout occured. " | 324 | "Mailbox command timeout occurred. " |
325 | "Issuing ISP abort.\n"); | 325 | "Issuing ISP abort.\n"); |
326 | 326 | ||
327 | set_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); | 327 | set_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags); |
@@ -3789,7 +3789,7 @@ qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, | |||
3789 | mcp->mb[20] = LSW(MSD(mreq->send_dma)); | 3789 | mcp->mb[20] = LSW(MSD(mreq->send_dma)); |
3790 | mcp->mb[21] = MSW(MSD(mreq->send_dma)); | 3790 | mcp->mb[21] = MSW(MSD(mreq->send_dma)); |
3791 | 3791 | ||
3792 | /* recieve data address */ | 3792 | /* receive data address */ |
3793 | mcp->mb[16] = LSW(mreq->rcv_dma); | 3793 | mcp->mb[16] = LSW(mreq->rcv_dma); |
3794 | mcp->mb[17] = MSW(mreq->rcv_dma); | 3794 | mcp->mb[17] = MSW(mreq->rcv_dma); |
3795 | mcp->mb[6] = LSW(MSD(mreq->rcv_dma)); | 3795 | mcp->mb[6] = LSW(MSD(mreq->rcv_dma)); |
diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c index 76ec876e6b21..455fe134d31d 100644 --- a/drivers/scsi/qla2xxx/qla_nx.c +++ b/drivers/scsi/qla2xxx/qla_nx.c | |||
@@ -2598,7 +2598,7 @@ qla82xx_calc_dsd_lists(uint16_t dsds) | |||
2598 | * qla82xx_start_scsi() - Send a SCSI command to the ISP | 2598 | * qla82xx_start_scsi() - Send a SCSI command to the ISP |
2599 | * @sp: command to send to the ISP | 2599 | * @sp: command to send to the ISP |
2600 | * | 2600 | * |
2601 | * Returns non-zero if a failure occured, else zero. | 2601 | * Returns non-zero if a failure occurred, else zero. |
2602 | */ | 2602 | */ |
2603 | int | 2603 | int |
2604 | qla82xx_start_scsi(srb_t *sp) | 2604 | qla82xx_start_scsi(srb_t *sp) |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 75a966c94860..aa7747529165 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -1046,7 +1046,7 @@ qla2xxx_eh_bus_reset(struct scsi_cmnd *cmd) | |||
1046 | 1046 | ||
1047 | eh_bus_reset_done: | 1047 | eh_bus_reset_done: |
1048 | qla_printk(KERN_INFO, vha->hw, "%s: reset %s\n", __func__, | 1048 | qla_printk(KERN_INFO, vha->hw, "%s: reset %s\n", __func__, |
1049 | (ret == FAILED) ? "failed" : "succeded"); | 1049 | (ret == FAILED) ? "failed" : "succeeded"); |
1050 | 1050 | ||
1051 | return ret; | 1051 | return ret; |
1052 | } | 1052 | } |
@@ -1136,7 +1136,7 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd) | |||
1136 | 1136 | ||
1137 | eh_host_reset_lock: | 1137 | eh_host_reset_lock: |
1138 | qla_printk(KERN_INFO, ha, "%s: reset %s\n", __func__, | 1138 | qla_printk(KERN_INFO, ha, "%s: reset %s\n", __func__, |
1139 | (ret == FAILED) ? "failed" : "succeded"); | 1139 | (ret == FAILED) ? "failed" : "succeeded"); |
1140 | 1140 | ||
1141 | return ret; | 1141 | return ret; |
1142 | } | 1142 | } |
@@ -3902,7 +3902,7 @@ uint32_t qla82xx_error_recovery(scsi_qla_host_t *base_vha) | |||
3902 | continue; | 3902 | continue; |
3903 | if (atomic_read(&other_pdev->enable_cnt)) { | 3903 | if (atomic_read(&other_pdev->enable_cnt)) { |
3904 | DEBUG17(qla_printk(KERN_INFO, ha, | 3904 | DEBUG17(qla_printk(KERN_INFO, ha, |
3905 | "Found PCI func availabe and enabled at 0x%x\n", | 3905 | "Found PCI func available and enabled at 0x%x\n", |
3906 | fn)); | 3906 | fn)); |
3907 | pci_dev_put(other_pdev); | 3907 | pci_dev_put(other_pdev); |
3908 | break; | 3908 | break; |
diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h index 2fc0045b1a52..4757878d59dd 100644 --- a/drivers/scsi/qla4xxx/ql4_def.h +++ b/drivers/scsi/qla4xxx/ql4_def.h | |||
@@ -53,6 +53,9 @@ | |||
53 | #define PCI_DEVICE_ID_QLOGIC_ISP8022 0x8022 | 53 | #define PCI_DEVICE_ID_QLOGIC_ISP8022 0x8022 |
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | #define ISP4XXX_PCI_FN_1 0x1 | ||
57 | #define ISP4XXX_PCI_FN_2 0x3 | ||
58 | |||
56 | #define QLA_SUCCESS 0 | 59 | #define QLA_SUCCESS 0 |
57 | #define QLA_ERROR 1 | 60 | #define QLA_ERROR 1 |
58 | 61 | ||
@@ -179,7 +182,7 @@ struct srb { | |||
179 | uint16_t flags; /* (1) Status flags. */ | 182 | uint16_t flags; /* (1) Status flags. */ |
180 | 183 | ||
181 | #define SRB_DMA_VALID BIT_3 /* DMA Buffer mapped. */ | 184 | #define SRB_DMA_VALID BIT_3 /* DMA Buffer mapped. */ |
182 | #define SRB_GOT_SENSE BIT_4 /* sense data recieved. */ | 185 | #define SRB_GOT_SENSE BIT_4 /* sense data received. */ |
183 | uint8_t state; /* (1) Status flags. */ | 186 | uint8_t state; /* (1) Status flags. */ |
184 | 187 | ||
185 | #define SRB_NO_QUEUE_STATE 0 /* Request is in between states */ | 188 | #define SRB_NO_QUEUE_STATE 0 /* Request is in between states */ |
@@ -233,9 +236,6 @@ struct ddb_entry { | |||
233 | 236 | ||
234 | unsigned long flags; /* DDB Flags */ | 237 | unsigned long flags; /* DDB Flags */ |
235 | 238 | ||
236 | unsigned long dev_scan_wait_to_start_relogin; | ||
237 | unsigned long dev_scan_wait_to_complete_relogin; | ||
238 | |||
239 | uint16_t fw_ddb_index; /* DDB firmware index */ | 239 | uint16_t fw_ddb_index; /* DDB firmware index */ |
240 | uint16_t options; | 240 | uint16_t options; |
241 | uint32_t fw_ddb_device_state; /* F/W Device State -- see ql4_fw.h */ | 241 | uint32_t fw_ddb_device_state; /* F/W Device State -- see ql4_fw.h */ |
@@ -289,8 +289,6 @@ struct ddb_entry { | |||
289 | * DDB flags. | 289 | * DDB flags. |
290 | */ | 290 | */ |
291 | #define DF_RELOGIN 0 /* Relogin to device */ | 291 | #define DF_RELOGIN 0 /* Relogin to device */ |
292 | #define DF_NO_RELOGIN 1 /* Do not relogin if IOCTL | ||
293 | * logged it out */ | ||
294 | #define DF_ISNS_DISCOVERED 2 /* Device was discovered via iSNS */ | 292 | #define DF_ISNS_DISCOVERED 2 /* Device was discovered via iSNS */ |
295 | #define DF_FO_MASKED 3 | 293 | #define DF_FO_MASKED 3 |
296 | 294 | ||
@@ -376,7 +374,7 @@ struct scsi_qla_host { | |||
376 | #define AF_LINK_UP 8 /* 0x00000100 */ | 374 | #define AF_LINK_UP 8 /* 0x00000100 */ |
377 | #define AF_IRQ_ATTACHED 10 /* 0x00000400 */ | 375 | #define AF_IRQ_ATTACHED 10 /* 0x00000400 */ |
378 | #define AF_DISABLE_ACB_COMPLETE 11 /* 0x00000800 */ | 376 | #define AF_DISABLE_ACB_COMPLETE 11 /* 0x00000800 */ |
379 | #define AF_HBA_GOING_AWAY 12 /* 0x00001000 */ | 377 | #define AF_HA_REMOVAL 12 /* 0x00001000 */ |
380 | #define AF_INTx_ENABLED 15 /* 0x00008000 */ | 378 | #define AF_INTx_ENABLED 15 /* 0x00008000 */ |
381 | #define AF_MSI_ENABLED 16 /* 0x00010000 */ | 379 | #define AF_MSI_ENABLED 16 /* 0x00010000 */ |
382 | #define AF_MSIX_ENABLED 17 /* 0x00020000 */ | 380 | #define AF_MSIX_ENABLED 17 /* 0x00020000 */ |
@@ -479,7 +477,6 @@ struct scsi_qla_host { | |||
479 | uint32_t timer_active; | 477 | uint32_t timer_active; |
480 | 478 | ||
481 | /* Recovery Timers */ | 479 | /* Recovery Timers */ |
482 | uint32_t discovery_wait; | ||
483 | atomic_t check_relogin_timeouts; | 480 | atomic_t check_relogin_timeouts; |
484 | uint32_t retry_reset_ha_cnt; | 481 | uint32_t retry_reset_ha_cnt; |
485 | uint32_t isp_reset_timer; /* reset test timer */ | 482 | uint32_t isp_reset_timer; /* reset test timer */ |
@@ -765,6 +762,5 @@ static inline void ql4xxx_unlock_drvr(struct scsi_qla_host *a) | |||
765 | /* Defines for process_aen() */ | 762 | /* Defines for process_aen() */ |
766 | #define PROCESS_ALL_AENS 0 | 763 | #define PROCESS_ALL_AENS 0 |
767 | #define FLUSH_DDB_CHANGED_AENS 1 | 764 | #define FLUSH_DDB_CHANGED_AENS 1 |
768 | #define RELOGIN_DDB_CHANGED_AENS 2 | ||
769 | 765 | ||
770 | #endif /*_QLA4XXX_H */ | 766 | #endif /*_QLA4XXX_H */ |
diff --git a/drivers/scsi/qla4xxx/ql4_fw.h b/drivers/scsi/qla4xxx/ql4_fw.h index c1985792f034..31e2bf97198c 100644 --- a/drivers/scsi/qla4xxx/ql4_fw.h +++ b/drivers/scsi/qla4xxx/ql4_fw.h | |||
@@ -455,6 +455,7 @@ struct addr_ctrl_blk { | |||
455 | uint8_t res0; /* 07 */ | 455 | uint8_t res0; /* 07 */ |
456 | uint16_t eth_mtu_size; /* 08-09 */ | 456 | uint16_t eth_mtu_size; /* 08-09 */ |
457 | uint16_t add_fw_options; /* 0A-0B */ | 457 | uint16_t add_fw_options; /* 0A-0B */ |
458 | #define SERIALIZE_TASK_MGMT 0x0400 | ||
458 | 459 | ||
459 | uint8_t hb_interval; /* 0C */ | 460 | uint8_t hb_interval; /* 0C */ |
460 | uint8_t inst_num; /* 0D */ | 461 | uint8_t inst_num; /* 0D */ |
diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h index 8fad99b7eef4..cc53e3fbd78c 100644 --- a/drivers/scsi/qla4xxx/ql4_glbl.h +++ b/drivers/scsi/qla4xxx/ql4_glbl.h | |||
@@ -136,7 +136,6 @@ void qla4_8xxx_clear_drv_active(struct scsi_qla_host *ha); | |||
136 | void qla4_8xxx_set_drv_active(struct scsi_qla_host *ha); | 136 | void qla4_8xxx_set_drv_active(struct scsi_qla_host *ha); |
137 | 137 | ||
138 | extern int ql4xextended_error_logging; | 138 | extern int ql4xextended_error_logging; |
139 | extern int ql4xdiscoverywait; | ||
140 | extern int ql4xdontresethba; | 139 | extern int ql4xdontresethba; |
141 | extern int ql4xenablemsix; | 140 | extern int ql4xenablemsix; |
142 | 141 | ||
diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c index 1629c48c35ef..48e2241ddaf4 100644 --- a/drivers/scsi/qla4xxx/ql4_init.c +++ b/drivers/scsi/qla4xxx/ql4_init.c | |||
@@ -723,13 +723,38 @@ int qla4_is_relogin_allowed(struct scsi_qla_host *ha, uint32_t conn_err) | |||
723 | return relogin; | 723 | return relogin; |
724 | } | 724 | } |
725 | 725 | ||
726 | static void qla4xxx_flush_AENS(struct scsi_qla_host *ha) | ||
727 | { | ||
728 | unsigned long wtime; | ||
729 | |||
730 | /* Flush the 0x8014 AEN from the firmware as a result of | ||
731 | * Auto connect. We are basically doing get_firmware_ddb() | ||
732 | * to determine whether we need to log back in or not. | ||
733 | * Trying to do a set ddb before we have processed 0x8014 | ||
734 | * will result in another set_ddb() for the same ddb. In other | ||
735 | * words there will be stale entries in the aen_q. | ||
736 | */ | ||
737 | wtime = jiffies + (2 * HZ); | ||
738 | do { | ||
739 | if (qla4xxx_get_firmware_state(ha) == QLA_SUCCESS) | ||
740 | if (ha->firmware_state & (BIT_2 | BIT_0)) | ||
741 | return; | ||
742 | |||
743 | if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags)) | ||
744 | qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); | ||
745 | |||
746 | msleep(1000); | ||
747 | } while (!time_after_eq(jiffies, wtime)); | ||
748 | } | ||
749 | |||
726 | /** | 750 | /** |
727 | * qla4xxx_configure_ddbs - builds driver ddb list | 751 | * qla4xxx_build_ddb_list - builds driver ddb list |
728 | * @ha: Pointer to host adapter structure. | 752 | * @ha: Pointer to host adapter structure. |
729 | * | 753 | * |
730 | * This routine searches for all valid firmware ddb entries and builds | 754 | * This routine searches for all valid firmware ddb entries and builds |
731 | * an internal ddb list. Ddbs that are considered valid are those with | 755 | * an internal ddb list. Ddbs that are considered valid are those with |
732 | * a device state of SESSION_ACTIVE. | 756 | * a device state of SESSION_ACTIVE. |
757 | * A relogin (set_ddb) is issued for DDBs that are not online. | ||
733 | **/ | 758 | **/ |
734 | static int qla4xxx_build_ddb_list(struct scsi_qla_host *ha) | 759 | static int qla4xxx_build_ddb_list(struct scsi_qla_host *ha) |
735 | { | 760 | { |
@@ -744,6 +769,8 @@ static int qla4xxx_build_ddb_list(struct scsi_qla_host *ha) | |||
744 | uint32_t ipv6_device; | 769 | uint32_t ipv6_device; |
745 | uint32_t new_tgt; | 770 | uint32_t new_tgt; |
746 | 771 | ||
772 | qla4xxx_flush_AENS(ha); | ||
773 | |||
747 | fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), | 774 | fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry), |
748 | &fw_ddb_entry_dma, GFP_KERNEL); | 775 | &fw_ddb_entry_dma, GFP_KERNEL); |
749 | if (fw_ddb_entry == NULL) { | 776 | if (fw_ddb_entry == NULL) { |
@@ -847,144 +874,6 @@ exit_build_ddb_list_no_free: | |||
847 | return status; | 874 | return status; |
848 | } | 875 | } |
849 | 876 | ||
850 | struct qla4_relog_scan { | ||
851 | int halt_wait; | ||
852 | uint32_t conn_err; | ||
853 | uint32_t fw_ddb_index; | ||
854 | uint32_t next_fw_ddb_index; | ||
855 | uint32_t fw_ddb_device_state; | ||
856 | }; | ||
857 | |||
858 | static int qla4_test_rdy(struct scsi_qla_host *ha, struct qla4_relog_scan *rs) | ||
859 | { | ||
860 | struct ddb_entry *ddb_entry; | ||
861 | |||
862 | if (qla4_is_relogin_allowed(ha, rs->conn_err)) { | ||
863 | /* We either have a device that is in | ||
864 | * the process of relogging in or a | ||
865 | * device that is waiting to be | ||
866 | * relogged in */ | ||
867 | rs->halt_wait = 0; | ||
868 | |||
869 | ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, | ||
870 | rs->fw_ddb_index); | ||
871 | if (ddb_entry == NULL) | ||
872 | return QLA_ERROR; | ||
873 | |||
874 | if (ddb_entry->dev_scan_wait_to_start_relogin != 0 | ||
875 | && time_after_eq(jiffies, | ||
876 | ddb_entry-> | ||
877 | dev_scan_wait_to_start_relogin)) | ||
878 | { | ||
879 | ddb_entry->dev_scan_wait_to_start_relogin = 0; | ||
880 | qla4xxx_set_ddb_entry(ha, rs->fw_ddb_index, 0); | ||
881 | } | ||
882 | } | ||
883 | return QLA_SUCCESS; | ||
884 | } | ||
885 | |||
886 | static int qla4_scan_for_relogin(struct scsi_qla_host *ha, | ||
887 | struct qla4_relog_scan *rs) | ||
888 | { | ||
889 | int error; | ||
890 | |||
891 | /* scan for relogins | ||
892 | * ----------------- */ | ||
893 | for (rs->fw_ddb_index = 0; rs->fw_ddb_index < MAX_DDB_ENTRIES; | ||
894 | rs->fw_ddb_index = rs->next_fw_ddb_index) { | ||
895 | if (qla4xxx_get_fwddb_entry(ha, rs->fw_ddb_index, NULL, 0, | ||
896 | NULL, &rs->next_fw_ddb_index, | ||
897 | &rs->fw_ddb_device_state, | ||
898 | &rs->conn_err, NULL, NULL) | ||
899 | == QLA_ERROR) | ||
900 | return QLA_ERROR; | ||
901 | |||
902 | if (rs->fw_ddb_device_state == DDB_DS_LOGIN_IN_PROCESS) | ||
903 | rs->halt_wait = 0; | ||
904 | |||
905 | if (rs->fw_ddb_device_state == DDB_DS_SESSION_FAILED || | ||
906 | rs->fw_ddb_device_state == DDB_DS_NO_CONNECTION_ACTIVE) { | ||
907 | error = qla4_test_rdy(ha, rs); | ||
908 | if (error) | ||
909 | return error; | ||
910 | } | ||
911 | |||
912 | /* We know we've reached the last device when | ||
913 | * next_fw_ddb_index is 0 */ | ||
914 | if (rs->next_fw_ddb_index == 0) | ||
915 | break; | ||
916 | } | ||
917 | return QLA_SUCCESS; | ||
918 | } | ||
919 | |||
920 | /** | ||
921 | * qla4xxx_devices_ready - wait for target devices to be logged in | ||
922 | * @ha: pointer to adapter structure | ||
923 | * | ||
924 | * This routine waits up to ql4xdiscoverywait seconds | ||
925 | * F/W database during driver load time. | ||
926 | **/ | ||
927 | static int qla4xxx_devices_ready(struct scsi_qla_host *ha) | ||
928 | { | ||
929 | int error; | ||
930 | unsigned long discovery_wtime; | ||
931 | struct qla4_relog_scan rs; | ||
932 | |||
933 | discovery_wtime = jiffies + (ql4xdiscoverywait * HZ); | ||
934 | |||
935 | DEBUG(printk("Waiting (%d) for devices ...\n", ql4xdiscoverywait)); | ||
936 | do { | ||
937 | /* poll for AEN. */ | ||
938 | qla4xxx_get_firmware_state(ha); | ||
939 | if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags)) { | ||
940 | /* Set time-between-relogin timer */ | ||
941 | qla4xxx_process_aen(ha, RELOGIN_DDB_CHANGED_AENS); | ||
942 | } | ||
943 | |||
944 | /* if no relogins active or needed, halt discvery wait */ | ||
945 | rs.halt_wait = 1; | ||
946 | |||
947 | error = qla4_scan_for_relogin(ha, &rs); | ||
948 | |||
949 | if (rs.halt_wait) { | ||
950 | DEBUG2(printk("scsi%ld: %s: Delay halted. Devices " | ||
951 | "Ready.\n", ha->host_no, __func__)); | ||
952 | return QLA_SUCCESS; | ||
953 | } | ||
954 | |||
955 | msleep(2000); | ||
956 | } while (!time_after_eq(jiffies, discovery_wtime)); | ||
957 | |||
958 | DEBUG3(qla4xxx_get_conn_event_log(ha)); | ||
959 | |||
960 | return QLA_SUCCESS; | ||
961 | } | ||
962 | |||
963 | static void qla4xxx_flush_AENS(struct scsi_qla_host *ha) | ||
964 | { | ||
965 | unsigned long wtime; | ||
966 | |||
967 | /* Flush the 0x8014 AEN from the firmware as a result of | ||
968 | * Auto connect. We are basically doing get_firmware_ddb() | ||
969 | * to determine whether we need to log back in or not. | ||
970 | * Trying to do a set ddb before we have processed 0x8014 | ||
971 | * will result in another set_ddb() for the same ddb. In other | ||
972 | * words there will be stale entries in the aen_q. | ||
973 | */ | ||
974 | wtime = jiffies + (2 * HZ); | ||
975 | do { | ||
976 | if (qla4xxx_get_firmware_state(ha) == QLA_SUCCESS) | ||
977 | if (ha->firmware_state & (BIT_2 | BIT_0)) | ||
978 | return; | ||
979 | |||
980 | if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags)) | ||
981 | qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS); | ||
982 | |||
983 | msleep(1000); | ||
984 | } while (!time_after_eq(jiffies, wtime)); | ||
985 | |||
986 | } | ||
987 | |||
988 | static int qla4xxx_initialize_ddb_list(struct scsi_qla_host *ha) | 877 | static int qla4xxx_initialize_ddb_list(struct scsi_qla_host *ha) |
989 | { | 878 | { |
990 | uint16_t fw_ddb_index; | 879 | uint16_t fw_ddb_index; |
@@ -996,29 +885,12 @@ static int qla4xxx_initialize_ddb_list(struct scsi_qla_host *ha) | |||
996 | 885 | ||
997 | for (fw_ddb_index = 0; fw_ddb_index < MAX_DDB_ENTRIES; fw_ddb_index++) | 886 | for (fw_ddb_index = 0; fw_ddb_index < MAX_DDB_ENTRIES; fw_ddb_index++) |
998 | ha->fw_ddb_index_map[fw_ddb_index] = | 887 | ha->fw_ddb_index_map[fw_ddb_index] = |
999 | (struct ddb_entry *)INVALID_ENTRY; | 888 | (struct ddb_entry *)INVALID_ENTRY; |
1000 | 889 | ||
1001 | ha->tot_ddbs = 0; | 890 | ha->tot_ddbs = 0; |
1002 | 891 | ||
1003 | qla4xxx_flush_AENS(ha); | 892 | /* Perform device discovery and build ddb list. */ |
1004 | 893 | status = qla4xxx_build_ddb_list(ha); | |
1005 | /* Wait for an AEN */ | ||
1006 | qla4xxx_devices_ready(ha); | ||
1007 | |||
1008 | /* | ||
1009 | * First perform device discovery for active | ||
1010 | * fw ddb indexes and build | ||
1011 | * ddb list. | ||
1012 | */ | ||
1013 | if ((status = qla4xxx_build_ddb_list(ha)) == QLA_ERROR) | ||
1014 | return status; | ||
1015 | |||
1016 | /* | ||
1017 | * Targets can come online after the inital discovery, so processing | ||
1018 | * the aens here will catch them. | ||
1019 | */ | ||
1020 | if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags)) | ||
1021 | qla4xxx_process_aen(ha, PROCESS_ALL_AENS); | ||
1022 | 894 | ||
1023 | return status; | 895 | return status; |
1024 | } | 896 | } |
@@ -1466,7 +1338,7 @@ exit_init_hba: | |||
1466 | } | 1338 | } |
1467 | 1339 | ||
1468 | DEBUG2(printk("scsi%ld: initialize adapter: %s\n", ha->host_no, | 1340 | DEBUG2(printk("scsi%ld: initialize adapter: %s\n", ha->host_no, |
1469 | status == QLA_ERROR ? "FAILED" : "SUCCEDED")); | 1341 | status == QLA_ERROR ? "FAILED" : "SUCCEEDED")); |
1470 | return status; | 1342 | return status; |
1471 | } | 1343 | } |
1472 | 1344 | ||
@@ -1537,7 +1409,6 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | |||
1537 | uint32_t state, uint32_t conn_err) | 1409 | uint32_t state, uint32_t conn_err) |
1538 | { | 1410 | { |
1539 | struct ddb_entry * ddb_entry; | 1411 | struct ddb_entry * ddb_entry; |
1540 | uint32_t old_fw_ddb_device_state; | ||
1541 | 1412 | ||
1542 | /* check for out of range index */ | 1413 | /* check for out of range index */ |
1543 | if (fw_ddb_index >= MAX_DDB_ENTRIES) | 1414 | if (fw_ddb_index >= MAX_DDB_ENTRIES) |
@@ -1553,27 +1424,18 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | |||
1553 | } | 1424 | } |
1554 | 1425 | ||
1555 | /* Device already exists in our database. */ | 1426 | /* Device already exists in our database. */ |
1556 | old_fw_ddb_device_state = ddb_entry->fw_ddb_device_state; | ||
1557 | DEBUG2(printk("scsi%ld: %s DDB - old state= 0x%x, new state=0x%x for " | 1427 | DEBUG2(printk("scsi%ld: %s DDB - old state= 0x%x, new state=0x%x for " |
1558 | "index [%d]\n", ha->host_no, __func__, | 1428 | "index [%d]\n", ha->host_no, __func__, |
1559 | ddb_entry->fw_ddb_device_state, state, fw_ddb_index)); | 1429 | ddb_entry->fw_ddb_device_state, state, fw_ddb_index)); |
1560 | if (old_fw_ddb_device_state == state && | ||
1561 | state == DDB_DS_SESSION_ACTIVE) { | ||
1562 | if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE) { | ||
1563 | atomic_set(&ddb_entry->state, DDB_STATE_ONLINE); | ||
1564 | iscsi_unblock_session(ddb_entry->sess); | ||
1565 | } | ||
1566 | return QLA_SUCCESS; | ||
1567 | } | ||
1568 | 1430 | ||
1569 | ddb_entry->fw_ddb_device_state = state; | 1431 | ddb_entry->fw_ddb_device_state = state; |
1570 | /* Device is back online. */ | 1432 | /* Device is back online. */ |
1571 | if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) { | 1433 | if ((ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) && |
1434 | (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE)) { | ||
1572 | atomic_set(&ddb_entry->state, DDB_STATE_ONLINE); | 1435 | atomic_set(&ddb_entry->state, DDB_STATE_ONLINE); |
1573 | atomic_set(&ddb_entry->relogin_retry_count, 0); | 1436 | atomic_set(&ddb_entry->relogin_retry_count, 0); |
1574 | atomic_set(&ddb_entry->relogin_timer, 0); | 1437 | atomic_set(&ddb_entry->relogin_timer, 0); |
1575 | clear_bit(DF_RELOGIN, &ddb_entry->flags); | 1438 | clear_bit(DF_RELOGIN, &ddb_entry->flags); |
1576 | clear_bit(DF_NO_RELOGIN, &ddb_entry->flags); | ||
1577 | iscsi_unblock_session(ddb_entry->sess); | 1439 | iscsi_unblock_session(ddb_entry->sess); |
1578 | iscsi_session_event(ddb_entry->sess, | 1440 | iscsi_session_event(ddb_entry->sess, |
1579 | ISCSI_KEVENT_CREATE_SESSION); | 1441 | ISCSI_KEVENT_CREATE_SESSION); |
@@ -1581,7 +1443,7 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | |||
1581 | * Change the lun state to READY in case the lun TIMEOUT before | 1443 | * Change the lun state to READY in case the lun TIMEOUT before |
1582 | * the device came back. | 1444 | * the device came back. |
1583 | */ | 1445 | */ |
1584 | } else { | 1446 | } else if (ddb_entry->fw_ddb_device_state != DDB_DS_SESSION_ACTIVE) { |
1585 | /* Device went away, mark device missing */ | 1447 | /* Device went away, mark device missing */ |
1586 | if (atomic_read(&ddb_entry->state) == DDB_STATE_ONLINE) { | 1448 | if (atomic_read(&ddb_entry->state) == DDB_STATE_ONLINE) { |
1587 | DEBUG2(ql4_printk(KERN_INFO, ha, "%s mark missing " | 1449 | DEBUG2(ql4_printk(KERN_INFO, ha, "%s mark missing " |
@@ -1598,7 +1460,6 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, | |||
1598 | */ | 1460 | */ |
1599 | if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_FAILED && | 1461 | if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_FAILED && |
1600 | !test_bit(DF_RELOGIN, &ddb_entry->flags) && | 1462 | !test_bit(DF_RELOGIN, &ddb_entry->flags) && |
1601 | !test_bit(DF_NO_RELOGIN, &ddb_entry->flags) && | ||
1602 | qla4_is_relogin_allowed(ha, conn_err)) { | 1463 | qla4_is_relogin_allowed(ha, conn_err)) { |
1603 | /* | 1464 | /* |
1604 | * This triggers a relogin. After the relogin_timer | 1465 | * This triggers a relogin. After the relogin_timer |
diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c index 03e028e6e809..2f40ac761cd4 100644 --- a/drivers/scsi/qla4xxx/ql4_isr.c +++ b/drivers/scsi/qla4xxx/ql4_isr.c | |||
@@ -801,7 +801,7 @@ irqreturn_t qla4xxx_intr_handler(int irq, void *dev_id) | |||
801 | &ha->reg->ctrl_status); | 801 | &ha->reg->ctrl_status); |
802 | readl(&ha->reg->ctrl_status); | 802 | readl(&ha->reg->ctrl_status); |
803 | 803 | ||
804 | if (!test_bit(AF_HBA_GOING_AWAY, &ha->flags)) | 804 | if (!test_bit(AF_HA_REMOVAL, &ha->flags)) |
805 | set_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); | 805 | set_bit(DPC_RESET_HA_INTR, &ha->dpc_flags); |
806 | 806 | ||
807 | break; | 807 | break; |
@@ -1008,34 +1008,9 @@ void qla4xxx_process_aen(struct scsi_qla_host * ha, uint8_t process_aen) | |||
1008 | mbox_sts[0], mbox_sts[2], | 1008 | mbox_sts[0], mbox_sts[2], |
1009 | mbox_sts[3])); | 1009 | mbox_sts[3])); |
1010 | break; | 1010 | break; |
1011 | } else if (process_aen == RELOGIN_DDB_CHANGED_AENS) { | ||
1012 | /* for use during init time, we only want to | ||
1013 | * relogin non-active ddbs */ | ||
1014 | struct ddb_entry *ddb_entry; | ||
1015 | |||
1016 | ddb_entry = | ||
1017 | /* FIXME: name length? */ | ||
1018 | qla4xxx_lookup_ddb_by_fw_index(ha, | ||
1019 | mbox_sts[2]); | ||
1020 | if (!ddb_entry) | ||
1021 | break; | ||
1022 | |||
1023 | ddb_entry->dev_scan_wait_to_complete_relogin = | ||
1024 | 0; | ||
1025 | ddb_entry->dev_scan_wait_to_start_relogin = | ||
1026 | jiffies + | ||
1027 | ((ddb_entry->default_time2wait + | ||
1028 | 4) * HZ); | ||
1029 | |||
1030 | DEBUG2(printk("scsi%ld: ddb [%d] initiate" | ||
1031 | " RELOGIN after %d seconds\n", | ||
1032 | ha->host_no, | ||
1033 | ddb_entry->fw_ddb_index, | ||
1034 | ddb_entry->default_time2wait + | ||
1035 | 4)); | ||
1036 | break; | ||
1037 | } | 1011 | } |
1038 | 1012 | case PROCESS_ALL_AENS: | |
1013 | default: | ||
1039 | if (mbox_sts[1] == 0) { /* Global DB change. */ | 1014 | if (mbox_sts[1] == 0) { /* Global DB change. */ |
1040 | qla4xxx_reinitialize_ddb_list(ha); | 1015 | qla4xxx_reinitialize_ddb_list(ha); |
1041 | } else if (mbox_sts[1] == 1) { /* Specific device. */ | 1016 | } else if (mbox_sts[1] == 1) { /* Specific device. */ |
diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c index f65626aec7c1..f9d81c8372c3 100644 --- a/drivers/scsi/qla4xxx/ql4_mbx.c +++ b/drivers/scsi/qla4xxx/ql4_mbx.c | |||
@@ -32,6 +32,7 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount, | |||
32 | u_long wait_count; | 32 | u_long wait_count; |
33 | uint32_t intr_status; | 33 | uint32_t intr_status; |
34 | unsigned long flags = 0; | 34 | unsigned long flags = 0; |
35 | uint32_t dev_state; | ||
35 | 36 | ||
36 | /* Make sure that pointers are valid */ | 37 | /* Make sure that pointers are valid */ |
37 | if (!mbx_cmd || !mbx_sts) { | 38 | if (!mbx_cmd || !mbx_sts) { |
@@ -40,12 +41,23 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount, | |||
40 | return status; | 41 | return status; |
41 | } | 42 | } |
42 | 43 | ||
43 | if (is_qla8022(ha) && | 44 | if (is_qla8022(ha)) { |
44 | test_bit(AF_FW_RECOVERY, &ha->flags)) { | 45 | if (test_bit(AF_FW_RECOVERY, &ha->flags)) { |
45 | DEBUG2(ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: prematurely " | 46 | DEBUG2(ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: " |
46 | "completing mbx cmd as firmware recovery detected\n", | 47 | "prematurely completing mbx cmd as firmware " |
47 | ha->host_no, __func__)); | 48 | "recovery detected\n", ha->host_no, __func__)); |
48 | return status; | 49 | return status; |
50 | } | ||
51 | /* Do not send any mbx cmd if h/w is in failed state*/ | ||
52 | qla4_8xxx_idc_lock(ha); | ||
53 | dev_state = qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE); | ||
54 | qla4_8xxx_idc_unlock(ha); | ||
55 | if (dev_state == QLA82XX_DEV_FAILED) { | ||
56 | ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: H/W is in " | ||
57 | "failed state, do not send any mailbox commands\n", | ||
58 | ha->host_no, __func__); | ||
59 | return status; | ||
60 | } | ||
49 | } | 61 | } |
50 | 62 | ||
51 | if ((is_aer_supported(ha)) && | 63 | if ((is_aer_supported(ha)) && |
@@ -139,7 +151,7 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount, | |||
139 | if (test_bit(AF_IRQ_ATTACHED, &ha->flags) && | 151 | if (test_bit(AF_IRQ_ATTACHED, &ha->flags) && |
140 | test_bit(AF_INTERRUPTS_ON, &ha->flags) && | 152 | test_bit(AF_INTERRUPTS_ON, &ha->flags) && |
141 | test_bit(AF_ONLINE, &ha->flags) && | 153 | test_bit(AF_ONLINE, &ha->flags) && |
142 | !test_bit(AF_HBA_GOING_AWAY, &ha->flags)) { | 154 | !test_bit(AF_HA_REMOVAL, &ha->flags)) { |
143 | /* Do not poll for completion. Use completion queue */ | 155 | /* Do not poll for completion. Use completion queue */ |
144 | set_bit(AF_MBOX_COMMAND_NOPOLL, &ha->flags); | 156 | set_bit(AF_MBOX_COMMAND_NOPOLL, &ha->flags); |
145 | wait_for_completion_timeout(&ha->mbx_intr_comp, MBOX_TOV * HZ); | 157 | wait_for_completion_timeout(&ha->mbx_intr_comp, MBOX_TOV * HZ); |
@@ -395,9 +407,6 @@ qla4xxx_update_local_ifcb(struct scsi_qla_host *ha, | |||
395 | /*memcpy(ha->alias, init_fw_cb->Alias, | 407 | /*memcpy(ha->alias, init_fw_cb->Alias, |
396 | min(sizeof(ha->alias), sizeof(init_fw_cb->Alias)));*/ | 408 | min(sizeof(ha->alias), sizeof(init_fw_cb->Alias)));*/ |
397 | 409 | ||
398 | /* Save Command Line Paramater info */ | ||
399 | ha->discovery_wait = ql4xdiscoverywait; | ||
400 | |||
401 | if (ha->acb_version == ACB_SUPPORTED) { | 410 | if (ha->acb_version == ACB_SUPPORTED) { |
402 | ha->ipv6_options = init_fw_cb->ipv6_opts; | 411 | ha->ipv6_options = init_fw_cb->ipv6_opts; |
403 | ha->ipv6_addl_options = init_fw_cb->ipv6_addtl_opts; | 412 | ha->ipv6_addl_options = init_fw_cb->ipv6_addtl_opts; |
@@ -467,6 +476,11 @@ int qla4xxx_initialize_fw_cb(struct scsi_qla_host * ha) | |||
467 | 476 | ||
468 | init_fw_cb->fw_options &= __constant_cpu_to_le16(~FWOPT_TARGET_MODE); | 477 | init_fw_cb->fw_options &= __constant_cpu_to_le16(~FWOPT_TARGET_MODE); |
469 | 478 | ||
479 | /* Set bit for "serialize task mgmt" all other bits need to be zero */ | ||
480 | init_fw_cb->add_fw_options = 0; | ||
481 | init_fw_cb->add_fw_options |= | ||
482 | __constant_cpu_to_le16(SERIALIZE_TASK_MGMT); | ||
483 | |||
470 | if (qla4xxx_set_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma) | 484 | if (qla4xxx_set_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma) |
471 | != QLA_SUCCESS) { | 485 | != QLA_SUCCESS) { |
472 | DEBUG2(printk(KERN_WARNING | 486 | DEBUG2(printk(KERN_WARNING |
diff --git a/drivers/scsi/qla4xxx/ql4_nvram.h b/drivers/scsi/qla4xxx/ql4_nvram.h index b3831bd29479..945cc328f57f 100644 --- a/drivers/scsi/qla4xxx/ql4_nvram.h +++ b/drivers/scsi/qla4xxx/ql4_nvram.h | |||
@@ -28,7 +28,7 @@ | |||
28 | #define FM93C56A_ERASE 0x3 | 28 | #define FM93C56A_ERASE 0x3 |
29 | #define FM93C56A_ERASE_ALL 0x0 | 29 | #define FM93C56A_ERASE_ALL 0x0 |
30 | 30 | ||
31 | /* Command Extentions */ | 31 | /* Command Extensions */ |
32 | #define FM93C56A_WEN_EXT 0x3 | 32 | #define FM93C56A_WEN_EXT 0x3 |
33 | #define FM93C56A_WRITE_ALL_EXT 0x1 | 33 | #define FM93C56A_WRITE_ALL_EXT 0x1 |
34 | #define FM93C56A_WDS_EXT 0x0 | 34 | #define FM93C56A_WDS_EXT 0x0 |
diff --git a/drivers/scsi/qla4xxx/ql4_nx.c b/drivers/scsi/qla4xxx/ql4_nx.c index 3d5ef2df4134..35381cb0936e 100644 --- a/drivers/scsi/qla4xxx/ql4_nx.c +++ b/drivers/scsi/qla4xxx/ql4_nx.c | |||
@@ -2304,14 +2304,13 @@ qla4_8xxx_enable_intrs(struct scsi_qla_host *ha) | |||
2304 | void | 2304 | void |
2305 | qla4_8xxx_disable_intrs(struct scsi_qla_host *ha) | 2305 | qla4_8xxx_disable_intrs(struct scsi_qla_host *ha) |
2306 | { | 2306 | { |
2307 | if (test_bit(AF_INTERRUPTS_ON, &ha->flags)) | 2307 | if (test_and_clear_bit(AF_INTERRUPTS_ON, &ha->flags)) |
2308 | qla4_8xxx_mbx_intr_disable(ha); | 2308 | qla4_8xxx_mbx_intr_disable(ha); |
2309 | 2309 | ||
2310 | spin_lock_irq(&ha->hardware_lock); | 2310 | spin_lock_irq(&ha->hardware_lock); |
2311 | /* BIT 10 - set */ | 2311 | /* BIT 10 - set */ |
2312 | qla4_8xxx_wr_32(ha, ha->nx_legacy_intr.tgt_mask_reg, 0x0400); | 2312 | qla4_8xxx_wr_32(ha, ha->nx_legacy_intr.tgt_mask_reg, 0x0400); |
2313 | spin_unlock_irq(&ha->hardware_lock); | 2313 | spin_unlock_irq(&ha->hardware_lock); |
2314 | clear_bit(AF_INTERRUPTS_ON, &ha->flags); | ||
2315 | } | 2314 | } |
2316 | 2315 | ||
2317 | struct ql4_init_msix_entry { | 2316 | struct ql4_init_msix_entry { |
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index 967836ef5ab2..230ba097d28c 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c | |||
@@ -29,10 +29,6 @@ static struct kmem_cache *srb_cachep; | |||
29 | /* | 29 | /* |
30 | * Module parameter information and variables | 30 | * Module parameter information and variables |
31 | */ | 31 | */ |
32 | int ql4xdiscoverywait = 60; | ||
33 | module_param(ql4xdiscoverywait, int, S_IRUGO | S_IWUSR); | ||
34 | MODULE_PARM_DESC(ql4xdiscoverywait, "Discovery wait time"); | ||
35 | |||
36 | int ql4xdontresethba = 0; | 32 | int ql4xdontresethba = 0; |
37 | module_param(ql4xdontresethba, int, S_IRUGO | S_IWUSR); | 33 | module_param(ql4xdontresethba, int, S_IRUGO | S_IWUSR); |
38 | MODULE_PARM_DESC(ql4xdontresethba, | 34 | MODULE_PARM_DESC(ql4xdontresethba, |
@@ -55,6 +51,17 @@ MODULE_PARM_DESC(ql4xenablemsix, | |||
55 | " 2 = enable MSI interrupt mechanism."); | 51 | " 2 = enable MSI interrupt mechanism."); |
56 | 52 | ||
57 | #define QL4_DEF_QDEPTH 32 | 53 | #define QL4_DEF_QDEPTH 32 |
54 | static int ql4xmaxqdepth = QL4_DEF_QDEPTH; | ||
55 | module_param(ql4xmaxqdepth, int, S_IRUGO | S_IWUSR); | ||
56 | MODULE_PARM_DESC(ql4xmaxqdepth, | ||
57 | "Maximum queue depth to report for target devices.\n" | ||
58 | " Default: 32."); | ||
59 | |||
60 | static int ql4xsess_recovery_tmo = QL4_SESS_RECOVERY_TMO; | ||
61 | module_param(ql4xsess_recovery_tmo, int, S_IRUGO); | ||
62 | MODULE_PARM_DESC(ql4xsess_recovery_tmo, | ||
63 | "Target Session Recovery Timeout.\n" | ||
64 | " Default: 30 sec."); | ||
58 | 65 | ||
59 | /* | 66 | /* |
60 | * SCSI host template entry points | 67 | * SCSI host template entry points |
@@ -165,7 +172,7 @@ static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session) | |||
165 | DEBUG2(printk("scsi%ld: %s: ddb [%d] session recovery timeout " | 172 | DEBUG2(printk("scsi%ld: %s: ddb [%d] session recovery timeout " |
166 | "of (%d) secs exhausted, marking device DEAD.\n", | 173 | "of (%d) secs exhausted, marking device DEAD.\n", |
167 | ha->host_no, __func__, ddb_entry->fw_ddb_index, | 174 | ha->host_no, __func__, ddb_entry->fw_ddb_index, |
168 | QL4_SESS_RECOVERY_TMO)); | 175 | ddb_entry->sess->recovery_tmo)); |
169 | } | 176 | } |
170 | } | 177 | } |
171 | 178 | ||
@@ -295,7 +302,7 @@ int qla4xxx_add_sess(struct ddb_entry *ddb_entry) | |||
295 | { | 302 | { |
296 | int err; | 303 | int err; |
297 | 304 | ||
298 | ddb_entry->sess->recovery_tmo = QL4_SESS_RECOVERY_TMO; | 305 | ddb_entry->sess->recovery_tmo = ql4xsess_recovery_tmo; |
299 | 306 | ||
300 | err = iscsi_add_session(ddb_entry->sess, ddb_entry->fw_ddb_index); | 307 | err = iscsi_add_session(ddb_entry->sess, ddb_entry->fw_ddb_index); |
301 | if (err) { | 308 | if (err) { |
@@ -753,12 +760,6 @@ static void qla4xxx_timer(struct scsi_qla_host *ha) | |||
753 | if (!pci_channel_offline(ha->pdev)) | 760 | if (!pci_channel_offline(ha->pdev)) |
754 | pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w); | 761 | pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w); |
755 | 762 | ||
756 | if (test_bit(AF_HBA_GOING_AWAY, &ha->flags)) { | ||
757 | DEBUG2(ql4_printk(KERN_INFO, ha, "%s exited. HBA GOING AWAY\n", | ||
758 | __func__)); | ||
759 | return; | ||
760 | } | ||
761 | |||
762 | if (is_qla8022(ha)) { | 763 | if (is_qla8022(ha)) { |
763 | qla4_8xxx_watchdog(ha); | 764 | qla4_8xxx_watchdog(ha); |
764 | } | 765 | } |
@@ -1067,7 +1068,6 @@ void qla4xxx_dead_adapter_cleanup(struct scsi_qla_host *ha) | |||
1067 | 1068 | ||
1068 | /* Disable the board */ | 1069 | /* Disable the board */ |
1069 | ql4_printk(KERN_INFO, ha, "Disabling the board\n"); | 1070 | ql4_printk(KERN_INFO, ha, "Disabling the board\n"); |
1070 | set_bit(AF_HBA_GOING_AWAY, &ha->flags); | ||
1071 | 1071 | ||
1072 | qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); | 1072 | qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16); |
1073 | qla4xxx_mark_all_devices_missing(ha); | 1073 | qla4xxx_mark_all_devices_missing(ha); |
@@ -1213,11 +1213,32 @@ recover_ha_init_adapter: | |||
1213 | 1213 | ||
1214 | clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); | 1214 | clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags); |
1215 | DEBUG2(printk("scsi%ld: recover adapter: %s\n", ha->host_no, | 1215 | DEBUG2(printk("scsi%ld: recover adapter: %s\n", ha->host_no, |
1216 | status == QLA_ERROR ? "FAILED" : "SUCCEDED")); | 1216 | status == QLA_ERROR ? "FAILED" : "SUCCEEDED")); |
1217 | 1217 | ||
1218 | return status; | 1218 | return status; |
1219 | } | 1219 | } |
1220 | 1220 | ||
1221 | static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha) | ||
1222 | { | ||
1223 | struct ddb_entry *ddb_entry, *dtemp; | ||
1224 | |||
1225 | list_for_each_entry_safe(ddb_entry, dtemp, &ha->ddb_list, list) { | ||
1226 | if ((atomic_read(&ddb_entry->state) == DDB_STATE_MISSING) || | ||
1227 | (atomic_read(&ddb_entry->state) == DDB_STATE_DEAD)) { | ||
1228 | if (ddb_entry->fw_ddb_device_state == | ||
1229 | DDB_DS_SESSION_ACTIVE) { | ||
1230 | atomic_set(&ddb_entry->state, DDB_STATE_ONLINE); | ||
1231 | ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]" | ||
1232 | " marked ONLINE\n", ha->host_no, __func__, | ||
1233 | ddb_entry->fw_ddb_index); | ||
1234 | |||
1235 | iscsi_unblock_session(ddb_entry->sess); | ||
1236 | } else | ||
1237 | qla4xxx_relogin_device(ha, ddb_entry); | ||
1238 | } | ||
1239 | } | ||
1240 | } | ||
1241 | |||
1221 | void qla4xxx_wake_dpc(struct scsi_qla_host *ha) | 1242 | void qla4xxx_wake_dpc(struct scsi_qla_host *ha) |
1222 | { | 1243 | { |
1223 | if (ha->dpc_thread && | 1244 | if (ha->dpc_thread && |
@@ -1259,11 +1280,6 @@ static void qla4xxx_do_dpc(struct work_struct *work) | |||
1259 | goto do_dpc_exit; | 1280 | goto do_dpc_exit; |
1260 | } | 1281 | } |
1261 | 1282 | ||
1262 | /* HBA is in the process of being permanently disabled. | ||
1263 | * Don't process anything */ | ||
1264 | if (test_bit(AF_HBA_GOING_AWAY, &ha->flags)) | ||
1265 | return; | ||
1266 | |||
1267 | if (is_qla8022(ha)) { | 1283 | if (is_qla8022(ha)) { |
1268 | if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) { | 1284 | if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) { |
1269 | qla4_8xxx_idc_lock(ha); | 1285 | qla4_8xxx_idc_lock(ha); |
@@ -1331,13 +1347,7 @@ dpc_post_reset_ha: | |||
1331 | if (test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) { | 1347 | if (test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) { |
1332 | if (!test_bit(AF_LINK_UP, &ha->flags)) { | 1348 | if (!test_bit(AF_LINK_UP, &ha->flags)) { |
1333 | /* ---- link down? --- */ | 1349 | /* ---- link down? --- */ |
1334 | list_for_each_entry_safe(ddb_entry, dtemp, | 1350 | qla4xxx_mark_all_devices_missing(ha); |
1335 | &ha->ddb_list, list) { | ||
1336 | if (atomic_read(&ddb_entry->state) == | ||
1337 | DDB_STATE_ONLINE) | ||
1338 | qla4xxx_mark_device_missing(ha, | ||
1339 | ddb_entry); | ||
1340 | } | ||
1341 | } else { | 1351 | } else { |
1342 | /* ---- link up? --- * | 1352 | /* ---- link up? --- * |
1343 | * F/W will auto login to all devices ONLY ONCE after | 1353 | * F/W will auto login to all devices ONLY ONCE after |
@@ -1346,30 +1356,7 @@ dpc_post_reset_ha: | |||
1346 | * manually relogin to devices when recovering from | 1356 | * manually relogin to devices when recovering from |
1347 | * connection failures, logouts, expired KATO, etc. */ | 1357 | * connection failures, logouts, expired KATO, etc. */ |
1348 | 1358 | ||
1349 | list_for_each_entry_safe(ddb_entry, dtemp, | 1359 | qla4xxx_relogin_all_devices(ha); |
1350 | &ha->ddb_list, list) { | ||
1351 | if ((atomic_read(&ddb_entry->state) == | ||
1352 | DDB_STATE_MISSING) || | ||
1353 | (atomic_read(&ddb_entry->state) == | ||
1354 | DDB_STATE_DEAD)) { | ||
1355 | if (ddb_entry->fw_ddb_device_state == | ||
1356 | DDB_DS_SESSION_ACTIVE) { | ||
1357 | atomic_set(&ddb_entry->state, | ||
1358 | DDB_STATE_ONLINE); | ||
1359 | ql4_printk(KERN_INFO, ha, | ||
1360 | "scsi%ld: %s: ddb[%d]" | ||
1361 | " marked ONLINE\n", | ||
1362 | ha->host_no, __func__, | ||
1363 | ddb_entry->fw_ddb_index); | ||
1364 | |||
1365 | iscsi_unblock_session( | ||
1366 | ddb_entry->sess); | ||
1367 | } else | ||
1368 | qla4xxx_relogin_device( | ||
1369 | ha, ddb_entry); | ||
1370 | } | ||
1371 | |||
1372 | } | ||
1373 | } | 1360 | } |
1374 | } | 1361 | } |
1375 | 1362 | ||
@@ -1630,6 +1617,7 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
1630 | uint8_t init_retry_count = 0; | 1617 | uint8_t init_retry_count = 0; |
1631 | char buf[34]; | 1618 | char buf[34]; |
1632 | struct qla4_8xxx_legacy_intr_set *nx_legacy_intr; | 1619 | struct qla4_8xxx_legacy_intr_set *nx_legacy_intr; |
1620 | uint32_t dev_state; | ||
1633 | 1621 | ||
1634 | if (pci_enable_device(pdev)) | 1622 | if (pci_enable_device(pdev)) |
1635 | return -1; | 1623 | return -1; |
@@ -1713,6 +1701,18 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
1713 | status = qla4xxx_initialize_adapter(ha, REBUILD_DDB_LIST); | 1701 | status = qla4xxx_initialize_adapter(ha, REBUILD_DDB_LIST); |
1714 | while ((!test_bit(AF_ONLINE, &ha->flags)) && | 1702 | while ((!test_bit(AF_ONLINE, &ha->flags)) && |
1715 | init_retry_count++ < MAX_INIT_RETRIES) { | 1703 | init_retry_count++ < MAX_INIT_RETRIES) { |
1704 | |||
1705 | if (is_qla8022(ha)) { | ||
1706 | qla4_8xxx_idc_lock(ha); | ||
1707 | dev_state = qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE); | ||
1708 | qla4_8xxx_idc_unlock(ha); | ||
1709 | if (dev_state == QLA82XX_DEV_FAILED) { | ||
1710 | ql4_printk(KERN_WARNING, ha, "%s: don't retry " | ||
1711 | "initialize adapter. H/W is in failed state\n", | ||
1712 | __func__); | ||
1713 | break; | ||
1714 | } | ||
1715 | } | ||
1716 | DEBUG2(printk("scsi: %s: retrying adapter initialization " | 1716 | DEBUG2(printk("scsi: %s: retrying adapter initialization " |
1717 | "(%d)\n", __func__, init_retry_count)); | 1717 | "(%d)\n", __func__, init_retry_count)); |
1718 | 1718 | ||
@@ -1815,6 +1815,44 @@ probe_disable_device: | |||
1815 | } | 1815 | } |
1816 | 1816 | ||
1817 | /** | 1817 | /** |
1818 | * qla4xxx_prevent_other_port_reinit - prevent other port from re-initialize | ||
1819 | * @ha: pointer to adapter structure | ||
1820 | * | ||
1821 | * Mark the other ISP-4xxx port to indicate that the driver is being removed, | ||
1822 | * so that the other port will not re-initialize while in the process of | ||
1823 | * removing the ha due to driver unload or hba hotplug. | ||
1824 | **/ | ||
1825 | static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha) | ||
1826 | { | ||
1827 | struct scsi_qla_host *other_ha = NULL; | ||
1828 | struct pci_dev *other_pdev = NULL; | ||
1829 | int fn = ISP4XXX_PCI_FN_2; | ||
1830 | |||
1831 | /*iscsi function numbers for ISP4xxx is 1 and 3*/ | ||
1832 | if (PCI_FUNC(ha->pdev->devfn) & BIT_1) | ||
1833 | fn = ISP4XXX_PCI_FN_1; | ||
1834 | |||
1835 | other_pdev = | ||
1836 | pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus), | ||
1837 | ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn), | ||
1838 | fn)); | ||
1839 | |||
1840 | /* Get other_ha if other_pdev is valid and state is enable*/ | ||
1841 | if (other_pdev) { | ||
1842 | if (atomic_read(&other_pdev->enable_cnt)) { | ||
1843 | other_ha = pci_get_drvdata(other_pdev); | ||
1844 | if (other_ha) { | ||
1845 | set_bit(AF_HA_REMOVAL, &other_ha->flags); | ||
1846 | DEBUG2(ql4_printk(KERN_INFO, ha, "%s: " | ||
1847 | "Prevent %s reinit\n", __func__, | ||
1848 | dev_name(&other_ha->pdev->dev))); | ||
1849 | } | ||
1850 | } | ||
1851 | pci_dev_put(other_pdev); | ||
1852 | } | ||
1853 | } | ||
1854 | |||
1855 | /** | ||
1818 | * qla4xxx_remove_adapter - calback function to remove adapter. | 1856 | * qla4xxx_remove_adapter - calback function to remove adapter. |
1819 | * @pci_dev: PCI device pointer | 1857 | * @pci_dev: PCI device pointer |
1820 | **/ | 1858 | **/ |
@@ -1824,7 +1862,8 @@ static void __devexit qla4xxx_remove_adapter(struct pci_dev *pdev) | |||
1824 | 1862 | ||
1825 | ha = pci_get_drvdata(pdev); | 1863 | ha = pci_get_drvdata(pdev); |
1826 | 1864 | ||
1827 | set_bit(AF_HBA_GOING_AWAY, &ha->flags); | 1865 | if (!is_qla8022(ha)) |
1866 | qla4xxx_prevent_other_port_reinit(ha); | ||
1828 | 1867 | ||
1829 | /* remove devs from iscsi_sessions to scsi_devices */ | 1868 | /* remove devs from iscsi_sessions to scsi_devices */ |
1830 | qla4xxx_free_ddb_list(ha); | 1869 | qla4xxx_free_ddb_list(ha); |
@@ -1868,10 +1907,15 @@ static int qla4xxx_slave_alloc(struct scsi_device *sdev) | |||
1868 | { | 1907 | { |
1869 | struct iscsi_cls_session *sess = starget_to_session(sdev->sdev_target); | 1908 | struct iscsi_cls_session *sess = starget_to_session(sdev->sdev_target); |
1870 | struct ddb_entry *ddb = sess->dd_data; | 1909 | struct ddb_entry *ddb = sess->dd_data; |
1910 | int queue_depth = QL4_DEF_QDEPTH; | ||
1871 | 1911 | ||
1872 | sdev->hostdata = ddb; | 1912 | sdev->hostdata = ddb; |
1873 | sdev->tagged_supported = 1; | 1913 | sdev->tagged_supported = 1; |
1874 | scsi_activate_tcq(sdev, QL4_DEF_QDEPTH); | 1914 | |
1915 | if (ql4xmaxqdepth != 0 && ql4xmaxqdepth <= 0xffffU) | ||
1916 | queue_depth = ql4xmaxqdepth; | ||
1917 | |||
1918 | scsi_activate_tcq(sdev, queue_depth); | ||
1875 | return 0; | 1919 | return 0; |
1876 | } | 1920 | } |
1877 | 1921 | ||
@@ -2066,7 +2110,7 @@ static int qla4xxx_eh_abort(struct scsi_cmnd *cmd) | |||
2066 | 2110 | ||
2067 | ql4_printk(KERN_INFO, ha, | 2111 | ql4_printk(KERN_INFO, ha, |
2068 | "scsi%ld:%d:%d: Abort command - %s\n", | 2112 | "scsi%ld:%d:%d: Abort command - %s\n", |
2069 | ha->host_no, id, lun, (ret == SUCCESS) ? "succeded" : "failed"); | 2113 | ha->host_no, id, lun, (ret == SUCCESS) ? "succeeded" : "failed"); |
2070 | 2114 | ||
2071 | return ret; | 2115 | return ret; |
2072 | } | 2116 | } |
@@ -2234,7 +2278,7 @@ static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd) | |||
2234 | return_status = SUCCESS; | 2278 | return_status = SUCCESS; |
2235 | 2279 | ||
2236 | ql4_printk(KERN_INFO, ha, "HOST RESET %s.\n", | 2280 | ql4_printk(KERN_INFO, ha, "HOST RESET %s.\n", |
2237 | return_status == FAILED ? "FAILED" : "SUCCEDED"); | 2281 | return_status == FAILED ? "FAILED" : "SUCCEEDED"); |
2238 | 2282 | ||
2239 | return return_status; | 2283 | return return_status; |
2240 | } | 2284 | } |
@@ -2448,7 +2492,7 @@ qla4xxx_pci_slot_reset(struct pci_dev *pdev) | |||
2448 | /* Initialize device or resume if in suspended state */ | 2492 | /* Initialize device or resume if in suspended state */ |
2449 | rc = pci_enable_device(pdev); | 2493 | rc = pci_enable_device(pdev); |
2450 | if (rc) { | 2494 | if (rc) { |
2451 | ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Cant re-enable " | 2495 | ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Can't re-enable " |
2452 | "device after reset\n", ha->host_no, __func__); | 2496 | "device after reset\n", ha->host_no, __func__); |
2453 | goto exit_slot_reset; | 2497 | goto exit_slot_reset; |
2454 | } | 2498 | } |
diff --git a/drivers/scsi/qla4xxx/ql4_version.h b/drivers/scsi/qla4xxx/ql4_version.h index 8475b308e01b..603155769407 100644 --- a/drivers/scsi/qla4xxx/ql4_version.h +++ b/drivers/scsi/qla4xxx/ql4_version.h | |||
@@ -5,4 +5,4 @@ | |||
5 | * See LICENSE.qla4xxx for copyright and licensing details. | 5 | * See LICENSE.qla4xxx for copyright and licensing details. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #define QLA4XXX_DRIVER_VERSION "5.02.00-k5" | 8 | #define QLA4XXX_DRIVER_VERSION "5.02.00-k6" |
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index fa5758cbdedb..6888b2ca5bfc 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c | |||
@@ -2454,7 +2454,7 @@ static void scsi_debug_slave_destroy(struct scsi_device *sdp) | |||
2454 | printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n", | 2454 | printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n", |
2455 | sdp->host->host_no, sdp->channel, sdp->id, sdp->lun); | 2455 | sdp->host->host_no, sdp->channel, sdp->id, sdp->lun); |
2456 | if (devip) { | 2456 | if (devip) { |
2457 | /* make this slot avaliable for re-use */ | 2457 | /* make this slot available for re-use */ |
2458 | devip->used = 0; | 2458 | devip->used = 0; |
2459 | sdp->hostdata = NULL; | 2459 | sdp->hostdata = NULL; |
2460 | } | 2460 | } |
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 991de3c15cfc..633c2395a92a 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -3,14 +3,14 @@ | |||
3 | * | 3 | * |
4 | * SCSI error/timeout handling | 4 | * SCSI error/timeout handling |
5 | * Initial versions: Eric Youngdale. Based upon conversations with | 5 | * Initial versions: Eric Youngdale. Based upon conversations with |
6 | * Leonard Zubkoff and David Miller at Linux Expo, | 6 | * Leonard Zubkoff and David Miller at Linux Expo, |
7 | * ideas originating from all over the place. | 7 | * ideas originating from all over the place. |
8 | * | 8 | * |
9 | * Restructured scsi_unjam_host and associated functions. | 9 | * Restructured scsi_unjam_host and associated functions. |
10 | * September 04, 2002 Mike Anderson (andmike@us.ibm.com) | 10 | * September 04, 2002 Mike Anderson (andmike@us.ibm.com) |
11 | * | 11 | * |
12 | * Forward port of Russell King's (rmk@arm.linux.org.uk) changes and | 12 | * Forward port of Russell King's (rmk@arm.linux.org.uk) changes and |
13 | * minor cleanups. | 13 | * minor cleanups. |
14 | * September 30, 2002 Mike Anderson (andmike@us.ibm.com) | 14 | * September 30, 2002 Mike Anderson (andmike@us.ibm.com) |
15 | */ | 15 | */ |
16 | 16 | ||
@@ -129,14 +129,15 @@ enum blk_eh_timer_return scsi_times_out(struct request *req) | |||
129 | { | 129 | { |
130 | struct scsi_cmnd *scmd = req->special; | 130 | struct scsi_cmnd *scmd = req->special; |
131 | enum blk_eh_timer_return rtn = BLK_EH_NOT_HANDLED; | 131 | enum blk_eh_timer_return rtn = BLK_EH_NOT_HANDLED; |
132 | struct Scsi_Host *host = scmd->device->host; | ||
132 | 133 | ||
133 | trace_scsi_dispatch_cmd_timeout(scmd); | 134 | trace_scsi_dispatch_cmd_timeout(scmd); |
134 | scsi_log_completion(scmd, TIMEOUT_ERROR); | 135 | scsi_log_completion(scmd, TIMEOUT_ERROR); |
135 | 136 | ||
136 | if (scmd->device->host->transportt->eh_timed_out) | 137 | if (host->transportt->eh_timed_out) |
137 | rtn = scmd->device->host->transportt->eh_timed_out(scmd); | 138 | rtn = host->transportt->eh_timed_out(scmd); |
138 | else if (scmd->device->host->hostt->eh_timed_out) | 139 | else if (host->hostt->eh_timed_out) |
139 | rtn = scmd->device->host->hostt->eh_timed_out(scmd); | 140 | rtn = host->hostt->eh_timed_out(scmd); |
140 | 141 | ||
141 | if (unlikely(rtn == BLK_EH_NOT_HANDLED && | 142 | if (unlikely(rtn == BLK_EH_NOT_HANDLED && |
142 | !scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD))) { | 143 | !scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD))) { |
@@ -195,7 +196,7 @@ static inline void scsi_eh_prt_fail_stats(struct Scsi_Host *shost, | |||
195 | ++total_failures; | 196 | ++total_failures; |
196 | if (scmd->eh_eflags & SCSI_EH_CANCEL_CMD) | 197 | if (scmd->eh_eflags & SCSI_EH_CANCEL_CMD) |
197 | ++cmd_cancel; | 198 | ++cmd_cancel; |
198 | else | 199 | else |
199 | ++cmd_failed; | 200 | ++cmd_failed; |
200 | } | 201 | } |
201 | } | 202 | } |
@@ -214,7 +215,7 @@ static inline void scsi_eh_prt_fail_stats(struct Scsi_Host *shost, | |||
214 | 215 | ||
215 | SCSI_LOG_ERROR_RECOVERY(2, printk("Total of %d commands on %d" | 216 | SCSI_LOG_ERROR_RECOVERY(2, printk("Total of %d commands on %d" |
216 | " devices require eh work\n", | 217 | " devices require eh work\n", |
217 | total_failures, devices_failed)); | 218 | total_failures, devices_failed)); |
218 | } | 219 | } |
219 | #endif | 220 | #endif |
220 | 221 | ||
@@ -294,7 +295,7 @@ static int scsi_check_sense(struct scsi_cmnd *scmd) | |||
294 | return NEEDS_RETRY; | 295 | return NEEDS_RETRY; |
295 | } | 296 | } |
296 | /* | 297 | /* |
297 | * if the device is in the process of becoming ready, we | 298 | * if the device is in the process of becoming ready, we |
298 | * should retry. | 299 | * should retry. |
299 | */ | 300 | */ |
300 | if ((sshdr.asc == 0x04) && (sshdr.ascq == 0x01)) | 301 | if ((sshdr.asc == 0x04) && (sshdr.ascq == 0x01)) |
@@ -488,7 +489,7 @@ static int scsi_eh_completed_normally(struct scsi_cmnd *scmd) | |||
488 | */ | 489 | */ |
489 | static void scsi_eh_done(struct scsi_cmnd *scmd) | 490 | static void scsi_eh_done(struct scsi_cmnd *scmd) |
490 | { | 491 | { |
491 | struct completion *eh_action; | 492 | struct completion *eh_action; |
492 | 493 | ||
493 | SCSI_LOG_ERROR_RECOVERY(3, | 494 | SCSI_LOG_ERROR_RECOVERY(3, |
494 | printk("%s scmd: %p result: %x\n", | 495 | printk("%s scmd: %p result: %x\n", |
@@ -507,22 +508,23 @@ static int scsi_try_host_reset(struct scsi_cmnd *scmd) | |||
507 | { | 508 | { |
508 | unsigned long flags; | 509 | unsigned long flags; |
509 | int rtn; | 510 | int rtn; |
511 | struct Scsi_Host *host = scmd->device->host; | ||
512 | struct scsi_host_template *hostt = host->hostt; | ||
510 | 513 | ||
511 | SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Snd Host RST\n", | 514 | SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Snd Host RST\n", |
512 | __func__)); | 515 | __func__)); |
513 | 516 | ||
514 | if (!scmd->device->host->hostt->eh_host_reset_handler) | 517 | if (!hostt->eh_host_reset_handler) |
515 | return FAILED; | 518 | return FAILED; |
516 | 519 | ||
517 | rtn = scmd->device->host->hostt->eh_host_reset_handler(scmd); | 520 | rtn = hostt->eh_host_reset_handler(scmd); |
518 | 521 | ||
519 | if (rtn == SUCCESS) { | 522 | if (rtn == SUCCESS) { |
520 | if (!scmd->device->host->hostt->skip_settle_delay) | 523 | if (!hostt->skip_settle_delay) |
521 | ssleep(HOST_RESET_SETTLE_TIME); | 524 | ssleep(HOST_RESET_SETTLE_TIME); |
522 | spin_lock_irqsave(scmd->device->host->host_lock, flags); | 525 | spin_lock_irqsave(host->host_lock, flags); |
523 | scsi_report_bus_reset(scmd->device->host, | 526 | scsi_report_bus_reset(host, scmd_channel(scmd)); |
524 | scmd_channel(scmd)); | 527 | spin_unlock_irqrestore(host->host_lock, flags); |
525 | spin_unlock_irqrestore(scmd->device->host->host_lock, flags); | ||
526 | } | 528 | } |
527 | 529 | ||
528 | return rtn; | 530 | return rtn; |
@@ -536,22 +538,23 @@ static int scsi_try_bus_reset(struct scsi_cmnd *scmd) | |||
536 | { | 538 | { |
537 | unsigned long flags; | 539 | unsigned long flags; |
538 | int rtn; | 540 | int rtn; |
541 | struct Scsi_Host *host = scmd->device->host; | ||
542 | struct scsi_host_template *hostt = host->hostt; | ||
539 | 543 | ||
540 | SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Snd Bus RST\n", | 544 | SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Snd Bus RST\n", |
541 | __func__)); | 545 | __func__)); |
542 | 546 | ||
543 | if (!scmd->device->host->hostt->eh_bus_reset_handler) | 547 | if (!hostt->eh_bus_reset_handler) |
544 | return FAILED; | 548 | return FAILED; |
545 | 549 | ||
546 | rtn = scmd->device->host->hostt->eh_bus_reset_handler(scmd); | 550 | rtn = hostt->eh_bus_reset_handler(scmd); |
547 | 551 | ||
548 | if (rtn == SUCCESS) { | 552 | if (rtn == SUCCESS) { |
549 | if (!scmd->device->host->hostt->skip_settle_delay) | 553 | if (!hostt->skip_settle_delay) |
550 | ssleep(BUS_RESET_SETTLE_TIME); | 554 | ssleep(BUS_RESET_SETTLE_TIME); |
551 | spin_lock_irqsave(scmd->device->host->host_lock, flags); | 555 | spin_lock_irqsave(host->host_lock, flags); |
552 | scsi_report_bus_reset(scmd->device->host, | 556 | scsi_report_bus_reset(host, scmd_channel(scmd)); |
553 | scmd_channel(scmd)); | 557 | spin_unlock_irqrestore(host->host_lock, flags); |
554 | spin_unlock_irqrestore(scmd->device->host->host_lock, flags); | ||
555 | } | 558 | } |
556 | 559 | ||
557 | return rtn; | 560 | return rtn; |
@@ -577,16 +580,18 @@ static int scsi_try_target_reset(struct scsi_cmnd *scmd) | |||
577 | { | 580 | { |
578 | unsigned long flags; | 581 | unsigned long flags; |
579 | int rtn; | 582 | int rtn; |
583 | struct Scsi_Host *host = scmd->device->host; | ||
584 | struct scsi_host_template *hostt = host->hostt; | ||
580 | 585 | ||
581 | if (!scmd->device->host->hostt->eh_target_reset_handler) | 586 | if (!hostt->eh_target_reset_handler) |
582 | return FAILED; | 587 | return FAILED; |
583 | 588 | ||
584 | rtn = scmd->device->host->hostt->eh_target_reset_handler(scmd); | 589 | rtn = hostt->eh_target_reset_handler(scmd); |
585 | if (rtn == SUCCESS) { | 590 | if (rtn == SUCCESS) { |
586 | spin_lock_irqsave(scmd->device->host->host_lock, flags); | 591 | spin_lock_irqsave(host->host_lock, flags); |
587 | __starget_for_each_device(scsi_target(scmd->device), NULL, | 592 | __starget_for_each_device(scsi_target(scmd->device), NULL, |
588 | __scsi_report_device_reset); | 593 | __scsi_report_device_reset); |
589 | spin_unlock_irqrestore(scmd->device->host->host_lock, flags); | 594 | spin_unlock_irqrestore(host->host_lock, flags); |
590 | } | 595 | } |
591 | 596 | ||
592 | return rtn; | 597 | return rtn; |
@@ -605,27 +610,28 @@ static int scsi_try_target_reset(struct scsi_cmnd *scmd) | |||
605 | static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd) | 610 | static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd) |
606 | { | 611 | { |
607 | int rtn; | 612 | int rtn; |
613 | struct scsi_host_template *hostt = scmd->device->host->hostt; | ||
608 | 614 | ||
609 | if (!scmd->device->host->hostt->eh_device_reset_handler) | 615 | if (!hostt->eh_device_reset_handler) |
610 | return FAILED; | 616 | return FAILED; |
611 | 617 | ||
612 | rtn = scmd->device->host->hostt->eh_device_reset_handler(scmd); | 618 | rtn = hostt->eh_device_reset_handler(scmd); |
613 | if (rtn == SUCCESS) | 619 | if (rtn == SUCCESS) |
614 | __scsi_report_device_reset(scmd->device, NULL); | 620 | __scsi_report_device_reset(scmd->device, NULL); |
615 | return rtn; | 621 | return rtn; |
616 | } | 622 | } |
617 | 623 | ||
618 | static int scsi_try_to_abort_cmd(struct scsi_cmnd *scmd) | 624 | static int scsi_try_to_abort_cmd(struct scsi_host_template *hostt, struct scsi_cmnd *scmd) |
619 | { | 625 | { |
620 | if (!scmd->device->host->hostt->eh_abort_handler) | 626 | if (!hostt->eh_abort_handler) |
621 | return FAILED; | 627 | return FAILED; |
622 | 628 | ||
623 | return scmd->device->host->hostt->eh_abort_handler(scmd); | 629 | return hostt->eh_abort_handler(scmd); |
624 | } | 630 | } |
625 | 631 | ||
626 | static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd) | 632 | static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd) |
627 | { | 633 | { |
628 | if (scsi_try_to_abort_cmd(scmd) != SUCCESS) | 634 | if (scsi_try_to_abort_cmd(scmd->device->host->hostt, scmd) != SUCCESS) |
629 | if (scsi_try_bus_device_reset(scmd) != SUCCESS) | 635 | if (scsi_try_bus_device_reset(scmd) != SUCCESS) |
630 | if (scsi_try_target_reset(scmd) != SUCCESS) | 636 | if (scsi_try_target_reset(scmd) != SUCCESS) |
631 | if (scsi_try_bus_reset(scmd) != SUCCESS) | 637 | if (scsi_try_bus_reset(scmd) != SUCCESS) |
@@ -846,7 +852,7 @@ EXPORT_SYMBOL(scsi_eh_finish_cmd); | |||
846 | * | 852 | * |
847 | * Description: | 853 | * Description: |
848 | * See if we need to request sense information. if so, then get it | 854 | * See if we need to request sense information. if so, then get it |
849 | * now, so we have a better idea of what to do. | 855 | * now, so we have a better idea of what to do. |
850 | * | 856 | * |
851 | * Notes: | 857 | * Notes: |
852 | * This has the unfortunate side effect that if a shost adapter does | 858 | * This has the unfortunate side effect that if a shost adapter does |
@@ -958,7 +964,7 @@ static int scsi_eh_abort_cmds(struct list_head *work_q, | |||
958 | SCSI_LOG_ERROR_RECOVERY(3, printk("%s: aborting cmd:" | 964 | SCSI_LOG_ERROR_RECOVERY(3, printk("%s: aborting cmd:" |
959 | "0x%p\n", current->comm, | 965 | "0x%p\n", current->comm, |
960 | scmd)); | 966 | scmd)); |
961 | rtn = scsi_try_to_abort_cmd(scmd); | 967 | rtn = scsi_try_to_abort_cmd(scmd->device->host->hostt, scmd); |
962 | if (rtn == SUCCESS || rtn == FAST_IO_FAIL) { | 968 | if (rtn == SUCCESS || rtn == FAST_IO_FAIL) { |
963 | scmd->eh_eflags &= ~SCSI_EH_CANCEL_CMD; | 969 | scmd->eh_eflags &= ~SCSI_EH_CANCEL_CMD; |
964 | if (!scsi_device_online(scmd->device) || | 970 | if (!scsi_device_online(scmd->device) || |
@@ -966,7 +972,6 @@ static int scsi_eh_abort_cmds(struct list_head *work_q, | |||
966 | !scsi_eh_tur(scmd)) { | 972 | !scsi_eh_tur(scmd)) { |
967 | scsi_eh_finish_cmd(scmd, done_q); | 973 | scsi_eh_finish_cmd(scmd, done_q); |
968 | } | 974 | } |
969 | |||
970 | } else | 975 | } else |
971 | SCSI_LOG_ERROR_RECOVERY(3, printk("%s: aborting" | 976 | SCSI_LOG_ERROR_RECOVERY(3, printk("%s: aborting" |
972 | " cmd failed:" | 977 | " cmd failed:" |
@@ -1010,7 +1015,7 @@ static int scsi_eh_try_stu(struct scsi_cmnd *scmd) | |||
1010 | * | 1015 | * |
1011 | * Notes: | 1016 | * Notes: |
1012 | * If commands are failing due to not ready, initializing command required, | 1017 | * If commands are failing due to not ready, initializing command required, |
1013 | * try revalidating the device, which will end up sending a start unit. | 1018 | * try revalidating the device, which will end up sending a start unit. |
1014 | */ | 1019 | */ |
1015 | static int scsi_eh_stu(struct Scsi_Host *shost, | 1020 | static int scsi_eh_stu(struct Scsi_Host *shost, |
1016 | struct list_head *work_q, | 1021 | struct list_head *work_q, |
@@ -1064,7 +1069,7 @@ static int scsi_eh_stu(struct Scsi_Host *shost, | |||
1064 | * Try a bus device reset. Still, look to see whether we have multiple | 1069 | * Try a bus device reset. Still, look to see whether we have multiple |
1065 | * devices that are jammed or not - if we have multiple devices, it | 1070 | * devices that are jammed or not - if we have multiple devices, it |
1066 | * makes no sense to try bus_device_reset - we really would need to try | 1071 | * makes no sense to try bus_device_reset - we really would need to try |
1067 | * a bus_reset instead. | 1072 | * a bus_reset instead. |
1068 | */ | 1073 | */ |
1069 | static int scsi_eh_bus_device_reset(struct Scsi_Host *shost, | 1074 | static int scsi_eh_bus_device_reset(struct Scsi_Host *shost, |
1070 | struct list_head *work_q, | 1075 | struct list_head *work_q, |
@@ -1164,7 +1169,7 @@ static int scsi_eh_target_reset(struct Scsi_Host *shost, | |||
1164 | } | 1169 | } |
1165 | 1170 | ||
1166 | /** | 1171 | /** |
1167 | * scsi_eh_bus_reset - send a bus reset | 1172 | * scsi_eh_bus_reset - send a bus reset |
1168 | * @shost: &scsi host being recovered. | 1173 | * @shost: &scsi host being recovered. |
1169 | * @work_q: &list_head for pending commands. | 1174 | * @work_q: &list_head for pending commands. |
1170 | * @done_q: &list_head for processed commands. | 1175 | * @done_q: &list_head for processed commands. |
@@ -1181,7 +1186,7 @@ static int scsi_eh_bus_reset(struct Scsi_Host *shost, | |||
1181 | * we really want to loop over the various channels, and do this on | 1186 | * we really want to loop over the various channels, and do this on |
1182 | * a channel by channel basis. we should also check to see if any | 1187 | * a channel by channel basis. we should also check to see if any |
1183 | * of the failed commands are on soft_reset devices, and if so, skip | 1188 | * of the failed commands are on soft_reset devices, and if so, skip |
1184 | * the reset. | 1189 | * the reset. |
1185 | */ | 1190 | */ |
1186 | 1191 | ||
1187 | for (channel = 0; channel <= shost->max_channel; channel++) { | 1192 | for (channel = 0; channel <= shost->max_channel; channel++) { |
@@ -1223,7 +1228,7 @@ static int scsi_eh_bus_reset(struct Scsi_Host *shost, | |||
1223 | } | 1228 | } |
1224 | 1229 | ||
1225 | /** | 1230 | /** |
1226 | * scsi_eh_host_reset - send a host reset | 1231 | * scsi_eh_host_reset - send a host reset |
1227 | * @work_q: list_head for processed commands. | 1232 | * @work_q: list_head for processed commands. |
1228 | * @done_q: list_head for processed commands. | 1233 | * @done_q: list_head for processed commands. |
1229 | */ | 1234 | */ |
@@ -1376,7 +1381,7 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd) | |||
1376 | return SUCCESS; | 1381 | return SUCCESS; |
1377 | /* | 1382 | /* |
1378 | * when the low level driver returns did_soft_error, | 1383 | * when the low level driver returns did_soft_error, |
1379 | * it is responsible for keeping an internal retry counter | 1384 | * it is responsible for keeping an internal retry counter |
1380 | * in order to avoid endless loops (db) | 1385 | * in order to avoid endless loops (db) |
1381 | * | 1386 | * |
1382 | * actually this is a bug in this function here. we should | 1387 | * actually this is a bug in this function here. we should |
@@ -1414,7 +1419,6 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd) | |||
1414 | */ | 1419 | */ |
1415 | break; | 1420 | break; |
1416 | /* fallthrough */ | 1421 | /* fallthrough */ |
1417 | |||
1418 | case DID_BUS_BUSY: | 1422 | case DID_BUS_BUSY: |
1419 | case DID_PARITY: | 1423 | case DID_PARITY: |
1420 | goto maybe_retry; | 1424 | goto maybe_retry; |
@@ -1982,7 +1986,7 @@ int scsi_normalize_sense(const u8 *sense_buffer, int sb_len, | |||
1982 | if (sb_len > 7) | 1986 | if (sb_len > 7) |
1983 | sshdr->additional_length = sense_buffer[7]; | 1987 | sshdr->additional_length = sense_buffer[7]; |
1984 | } else { | 1988 | } else { |
1985 | /* | 1989 | /* |
1986 | * fixed format | 1990 | * fixed format |
1987 | */ | 1991 | */ |
1988 | if (sb_len > 2) | 1992 | if (sb_len > 2) |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 2d63c8ad1442..e9901b8f8443 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -67,6 +67,13 @@ static struct scsi_host_sg_pool scsi_sg_pools[] = { | |||
67 | 67 | ||
68 | struct kmem_cache *scsi_sdb_cache; | 68 | struct kmem_cache *scsi_sdb_cache; |
69 | 69 | ||
70 | /* | ||
71 | * When to reinvoke queueing after a resource shortage. It's 3 msecs to | ||
72 | * not change behaviour from the previous unplug mechanism, experimentation | ||
73 | * may prove this needs changing. | ||
74 | */ | ||
75 | #define SCSI_QUEUE_DELAY 3 | ||
76 | |||
70 | static void scsi_run_queue(struct request_queue *q); | 77 | static void scsi_run_queue(struct request_queue *q); |
71 | 78 | ||
72 | /* | 79 | /* |
@@ -149,14 +156,7 @@ static int __scsi_queue_insert(struct scsi_cmnd *cmd, int reason, int unbusy) | |||
149 | /* | 156 | /* |
150 | * Requeue this command. It will go before all other commands | 157 | * Requeue this command. It will go before all other commands |
151 | * that are already in the queue. | 158 | * that are already in the queue. |
152 | * | 159 | */ |
153 | * NOTE: there is magic here about the way the queue is plugged if | ||
154 | * we have no outstanding commands. | ||
155 | * | ||
156 | * Although we *don't* plug the queue, we call the request | ||
157 | * function. The SCSI request function detects the blocked condition | ||
158 | * and plugs the queue appropriately. | ||
159 | */ | ||
160 | spin_lock_irqsave(q->queue_lock, flags); | 160 | spin_lock_irqsave(q->queue_lock, flags); |
161 | blk_requeue_request(q, cmd->request); | 161 | blk_requeue_request(q, cmd->request); |
162 | spin_unlock_irqrestore(q->queue_lock, flags); | 162 | spin_unlock_irqrestore(q->queue_lock, flags); |
@@ -411,8 +411,6 @@ static void scsi_run_queue(struct request_queue *q) | |||
411 | list_splice_init(&shost->starved_list, &starved_list); | 411 | list_splice_init(&shost->starved_list, &starved_list); |
412 | 412 | ||
413 | while (!list_empty(&starved_list)) { | 413 | while (!list_empty(&starved_list)) { |
414 | int flagset; | ||
415 | |||
416 | /* | 414 | /* |
417 | * As long as shost is accepting commands and we have | 415 | * As long as shost is accepting commands and we have |
418 | * starved queues, call blk_run_queue. scsi_request_fn | 416 | * starved queues, call blk_run_queue. scsi_request_fn |
@@ -435,20 +433,7 @@ static void scsi_run_queue(struct request_queue *q) | |||
435 | continue; | 433 | continue; |
436 | } | 434 | } |
437 | 435 | ||
438 | spin_unlock(shost->host_lock); | 436 | blk_run_queue_async(sdev->request_queue); |
439 | |||
440 | spin_lock(sdev->request_queue->queue_lock); | ||
441 | flagset = test_bit(QUEUE_FLAG_REENTER, &q->queue_flags) && | ||
442 | !test_bit(QUEUE_FLAG_REENTER, | ||
443 | &sdev->request_queue->queue_flags); | ||
444 | if (flagset) | ||
445 | queue_flag_set(QUEUE_FLAG_REENTER, sdev->request_queue); | ||
446 | __blk_run_queue(sdev->request_queue, false); | ||
447 | if (flagset) | ||
448 | queue_flag_clear(QUEUE_FLAG_REENTER, sdev->request_queue); | ||
449 | spin_unlock(sdev->request_queue->queue_lock); | ||
450 | |||
451 | spin_lock(shost->host_lock); | ||
452 | } | 437 | } |
453 | /* put any unprocessed entries back */ | 438 | /* put any unprocessed entries back */ |
454 | list_splice(&starved_list, &shost->starved_list); | 439 | list_splice(&starved_list, &shost->starved_list); |
@@ -1226,11 +1211,11 @@ int scsi_prep_return(struct request_queue *q, struct request *req, int ret) | |||
1226 | case BLKPREP_DEFER: | 1211 | case BLKPREP_DEFER: |
1227 | /* | 1212 | /* |
1228 | * If we defer, the blk_peek_request() returns NULL, but the | 1213 | * If we defer, the blk_peek_request() returns NULL, but the |
1229 | * queue must be restarted, so we plug here if no returning | 1214 | * queue must be restarted, so we schedule a callback to happen |
1230 | * command will automatically do that. | 1215 | * shortly. |
1231 | */ | 1216 | */ |
1232 | if (sdev->device_busy == 0) | 1217 | if (sdev->device_busy == 0) |
1233 | blk_plug_device(q); | 1218 | blk_delay_queue(q, SCSI_QUEUE_DELAY); |
1234 | break; | 1219 | break; |
1235 | default: | 1220 | default: |
1236 | req->cmd_flags |= REQ_DONTPREP; | 1221 | req->cmd_flags |= REQ_DONTPREP; |
@@ -1269,7 +1254,7 @@ static inline int scsi_dev_queue_ready(struct request_queue *q, | |||
1269 | sdev_printk(KERN_INFO, sdev, | 1254 | sdev_printk(KERN_INFO, sdev, |
1270 | "unblocking device at zero depth\n")); | 1255 | "unblocking device at zero depth\n")); |
1271 | } else { | 1256 | } else { |
1272 | blk_plug_device(q); | 1257 | blk_delay_queue(q, SCSI_QUEUE_DELAY); |
1273 | return 0; | 1258 | return 0; |
1274 | } | 1259 | } |
1275 | } | 1260 | } |
@@ -1499,7 +1484,7 @@ static void scsi_request_fn(struct request_queue *q) | |||
1499 | * the host is no longer able to accept any more requests. | 1484 | * the host is no longer able to accept any more requests. |
1500 | */ | 1485 | */ |
1501 | shost = sdev->host; | 1486 | shost = sdev->host; |
1502 | while (!blk_queue_plugged(q)) { | 1487 | for (;;) { |
1503 | int rtn; | 1488 | int rtn; |
1504 | /* | 1489 | /* |
1505 | * get next queueable request. We do this early to make sure | 1490 | * get next queueable request. We do this early to make sure |
@@ -1578,15 +1563,8 @@ static void scsi_request_fn(struct request_queue *q) | |||
1578 | */ | 1563 | */ |
1579 | rtn = scsi_dispatch_cmd(cmd); | 1564 | rtn = scsi_dispatch_cmd(cmd); |
1580 | spin_lock_irq(q->queue_lock); | 1565 | spin_lock_irq(q->queue_lock); |
1581 | if(rtn) { | 1566 | if (rtn) |
1582 | /* we're refusing the command; because of | 1567 | goto out_delay; |
1583 | * the way locks get dropped, we need to | ||
1584 | * check here if plugging is required */ | ||
1585 | if(sdev->device_busy == 0) | ||
1586 | blk_plug_device(q); | ||
1587 | |||
1588 | break; | ||
1589 | } | ||
1590 | } | 1568 | } |
1591 | 1569 | ||
1592 | goto out; | 1570 | goto out; |
@@ -1605,9 +1583,10 @@ static void scsi_request_fn(struct request_queue *q) | |||
1605 | spin_lock_irq(q->queue_lock); | 1583 | spin_lock_irq(q->queue_lock); |
1606 | blk_requeue_request(q, req); | 1584 | blk_requeue_request(q, req); |
1607 | sdev->device_busy--; | 1585 | sdev->device_busy--; |
1608 | if(sdev->device_busy == 0) | 1586 | out_delay: |
1609 | blk_plug_device(q); | 1587 | if (sdev->device_busy == 0) |
1610 | out: | 1588 | blk_delay_queue(q, SCSI_QUEUE_DELAY); |
1589 | out: | ||
1611 | /* must be careful here...if we trigger the ->remove() function | 1590 | /* must be careful here...if we trigger the ->remove() function |
1612 | * we cannot be holding the q lock */ | 1591 | * we cannot be holding the q lock */ |
1613 | spin_unlock_irq(q->queue_lock); | 1592 | spin_unlock_irq(q->queue_lock); |
diff --git a/drivers/scsi/scsi_netlink.c b/drivers/scsi/scsi_netlink.c index a2ed201885ae..26a8a45584ef 100644 --- a/drivers/scsi/scsi_netlink.c +++ b/drivers/scsi/scsi_netlink.c | |||
@@ -499,7 +499,7 @@ scsi_netlink_init(void) | |||
499 | SCSI_NL_GRP_CNT, scsi_nl_rcv_msg, NULL, | 499 | SCSI_NL_GRP_CNT, scsi_nl_rcv_msg, NULL, |
500 | THIS_MODULE); | 500 | THIS_MODULE); |
501 | if (!scsi_nl_sock) { | 501 | if (!scsi_nl_sock) { |
502 | printk(KERN_ERR "%s: register of recieve handler failed\n", | 502 | printk(KERN_ERR "%s: register of receive handler failed\n", |
503 | __func__); | 503 | __func__); |
504 | netlink_unregister_notifier(&scsi_netlink_notifier); | 504 | netlink_unregister_notifier(&scsi_netlink_notifier); |
505 | return; | 505 | return; |
diff --git a/drivers/scsi/scsi_tgt_lib.c b/drivers/scsi/scsi_tgt_lib.c index f67282058ba1..8bca8c25ba69 100644 --- a/drivers/scsi/scsi_tgt_lib.c +++ b/drivers/scsi/scsi_tgt_lib.c | |||
@@ -93,7 +93,7 @@ struct scsi_cmnd *scsi_host_get_command(struct Scsi_Host *shost, | |||
93 | 93 | ||
94 | /* | 94 | /* |
95 | * The blk helpers are used to the READ/WRITE requests | 95 | * The blk helpers are used to the READ/WRITE requests |
96 | * transfering data from a initiator point of view. Since | 96 | * transferring data from a initiator point of view. Since |
97 | * we are in target mode we want the opposite. | 97 | * we are in target mode we want the opposite. |
98 | */ | 98 | */ |
99 | rq = blk_get_request(shost->uspace_req_q, !write, gfp_mask); | 99 | rq = blk_get_request(shost->uspace_req_q, !write, gfp_mask); |
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 5c3ccfc6b622..815069d13f9b 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
@@ -2378,7 +2378,7 @@ fc_flush_devloss(struct Scsi_Host *shost) | |||
2378 | * fc_remove_host - called to terminate any fc_transport-related elements for a scsi host. | 2378 | * fc_remove_host - called to terminate any fc_transport-related elements for a scsi host. |
2379 | * @shost: Which &Scsi_Host | 2379 | * @shost: Which &Scsi_Host |
2380 | * | 2380 | * |
2381 | * This routine is expected to be called immediately preceeding the | 2381 | * This routine is expected to be called immediately preceding the |
2382 | * a driver's call to scsi_remove_host(). | 2382 | * a driver's call to scsi_remove_host(). |
2383 | * | 2383 | * |
2384 | * WARNING: A driver utilizing the fc_transport, which fails to call | 2384 | * WARNING: A driver utilizing the fc_transport, which fails to call |
@@ -2458,7 +2458,7 @@ static void fc_terminate_rport_io(struct fc_rport *rport) | |||
2458 | } | 2458 | } |
2459 | 2459 | ||
2460 | /** | 2460 | /** |
2461 | * fc_starget_delete - called to delete the scsi decendents of an rport | 2461 | * fc_starget_delete - called to delete the scsi descendants of an rport |
2462 | * @work: remote port to be operated on. | 2462 | * @work: remote port to be operated on. |
2463 | * | 2463 | * |
2464 | * Deletes target and all sdevs. | 2464 | * Deletes target and all sdevs. |
@@ -3816,28 +3816,17 @@ fail_host_msg: | |||
3816 | static void | 3816 | static void |
3817 | fc_bsg_goose_queue(struct fc_rport *rport) | 3817 | fc_bsg_goose_queue(struct fc_rport *rport) |
3818 | { | 3818 | { |
3819 | int flagset; | ||
3820 | unsigned long flags; | ||
3821 | |||
3822 | if (!rport->rqst_q) | 3819 | if (!rport->rqst_q) |
3823 | return; | 3820 | return; |
3824 | 3821 | ||
3822 | /* | ||
3823 | * This get/put dance makes no sense | ||
3824 | */ | ||
3825 | get_device(&rport->dev); | 3825 | get_device(&rport->dev); |
3826 | 3826 | blk_run_queue_async(rport->rqst_q); | |
3827 | spin_lock_irqsave(rport->rqst_q->queue_lock, flags); | ||
3828 | flagset = test_bit(QUEUE_FLAG_REENTER, &rport->rqst_q->queue_flags) && | ||
3829 | !test_bit(QUEUE_FLAG_REENTER, &rport->rqst_q->queue_flags); | ||
3830 | if (flagset) | ||
3831 | queue_flag_set(QUEUE_FLAG_REENTER, rport->rqst_q); | ||
3832 | __blk_run_queue(rport->rqst_q, false); | ||
3833 | if (flagset) | ||
3834 | queue_flag_clear(QUEUE_FLAG_REENTER, rport->rqst_q); | ||
3835 | spin_unlock_irqrestore(rport->rqst_q->queue_lock, flags); | ||
3836 | |||
3837 | put_device(&rport->dev); | 3827 | put_device(&rport->dev); |
3838 | } | 3828 | } |
3839 | 3829 | ||
3840 | |||
3841 | /** | 3830 | /** |
3842 | * fc_bsg_rport_dispatch - process rport bsg requests and dispatch to LLDD | 3831 | * fc_bsg_rport_dispatch - process rport bsg requests and dispatch to LLDD |
3843 | * @q: rport request queue | 3832 | * @q: rport request queue |
@@ -3913,7 +3902,7 @@ fc_bsg_request_handler(struct request_queue *q, struct Scsi_Host *shost, | |||
3913 | if (!get_device(dev)) | 3902 | if (!get_device(dev)) |
3914 | return; | 3903 | return; |
3915 | 3904 | ||
3916 | while (!blk_queue_plugged(q)) { | 3905 | while (1) { |
3917 | if (rport && (rport->port_state == FC_PORTSTATE_BLOCKED) && | 3906 | if (rport && (rport->port_state == FC_PORTSTATE_BLOCKED) && |
3918 | !(rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)) | 3907 | !(rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)) |
3919 | break; | 3908 | break; |
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index b4218390941e..3fd16d7212de 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
@@ -1917,7 +1917,7 @@ store_priv_session_##field(struct device *dev, \ | |||
1917 | #define iscsi_priv_session_rw_attr(field, format) \ | 1917 | #define iscsi_priv_session_rw_attr(field, format) \ |
1918 | iscsi_priv_session_attr_show(field, format) \ | 1918 | iscsi_priv_session_attr_show(field, format) \ |
1919 | iscsi_priv_session_attr_store(field) \ | 1919 | iscsi_priv_session_attr_store(field) \ |
1920 | static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO | S_IWUGO, \ | 1920 | static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO | S_IWUSR, \ |
1921 | show_priv_session_##field, \ | 1921 | show_priv_session_##field, \ |
1922 | store_priv_session_##field) | 1922 | store_priv_session_##field) |
1923 | iscsi_priv_session_rw_attr(recovery_tmo, "%d"); | 1923 | iscsi_priv_session_rw_attr(recovery_tmo, "%d"); |
diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c index 927e99cb7225..c6fcf76cade5 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c | |||
@@ -173,11 +173,7 @@ static void sas_smp_request(struct request_queue *q, struct Scsi_Host *shost, | |||
173 | int ret; | 173 | int ret; |
174 | int (*handler)(struct Scsi_Host *, struct sas_rphy *, struct request *); | 174 | int (*handler)(struct Scsi_Host *, struct sas_rphy *, struct request *); |
175 | 175 | ||
176 | while (!blk_queue_plugged(q)) { | 176 | while ((req = blk_fetch_request(q)) != NULL) { |
177 | req = blk_fetch_request(q); | ||
178 | if (!req) | ||
179 | break; | ||
180 | |||
181 | spin_unlock_irq(q->queue_lock); | 177 | spin_unlock_irq(q->queue_lock); |
182 | 178 | ||
183 | handler = to_sas_internal(shost->transportt)->f->smp_handler; | 179 | handler = to_sas_internal(shost->transportt)->f->smp_handler; |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 3be5db5d6343..bd0806e64e85 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -597,6 +597,7 @@ static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq) | |||
597 | break; | 597 | break; |
598 | 598 | ||
599 | default: | 599 | default: |
600 | ret = BLKPREP_KILL; | ||
600 | goto out; | 601 | goto out; |
601 | } | 602 | } |
602 | 603 | ||
@@ -1054,7 +1055,7 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
1054 | * @arg: this is third argument given to ioctl(2) system call. | 1055 | * @arg: this is third argument given to ioctl(2) system call. |
1055 | * Often contains a pointer. | 1056 | * Often contains a pointer. |
1056 | * | 1057 | * |
1057 | * Returns 0 if successful (some ioctls return postive numbers on | 1058 | * Returns 0 if successful (some ioctls return positive numbers on |
1058 | * success as well). Returns a negated errno value in case of error. | 1059 | * success as well). Returns a negated errno value in case of error. |
1059 | * | 1060 | * |
1060 | * Note: most ioctls are forward onto the block subsystem or further | 1061 | * Note: most ioctls are forward onto the block subsystem or further |
@@ -2026,14 +2027,10 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) | |||
2026 | int old_rcd = sdkp->RCD; | 2027 | int old_rcd = sdkp->RCD; |
2027 | int old_dpofua = sdkp->DPOFUA; | 2028 | int old_dpofua = sdkp->DPOFUA; |
2028 | 2029 | ||
2029 | if (sdp->skip_ms_page_8) { | 2030 | if (sdp->skip_ms_page_8) |
2030 | if (sdp->type == TYPE_RBC) | 2031 | goto defaults; |
2031 | goto defaults; | 2032 | |
2032 | else { | 2033 | if (sdp->type == TYPE_RBC) { |
2033 | modepage = 0x3F; | ||
2034 | dbd = 0; | ||
2035 | } | ||
2036 | } else if (sdp->type == TYPE_RBC) { | ||
2037 | modepage = 6; | 2034 | modepage = 6; |
2038 | dbd = 8; | 2035 | dbd = 8; |
2039 | } else { | 2036 | } else { |
@@ -2061,11 +2058,13 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) | |||
2061 | */ | 2058 | */ |
2062 | if (len < 3) | 2059 | if (len < 3) |
2063 | goto bad_sense; | 2060 | goto bad_sense; |
2064 | else if (len > SD_BUF_SIZE) { | 2061 | if (len > 20) |
2065 | sd_printk(KERN_NOTICE, sdkp, "Truncating mode parameter " | 2062 | len = 20; |
2066 | "data from %d to %d bytes\n", len, SD_BUF_SIZE); | 2063 | |
2067 | len = SD_BUF_SIZE; | 2064 | /* Take headers and block descriptors into account */ |
2068 | } | 2065 | len += data.header_length + data.block_descriptor_length; |
2066 | if (len > SD_BUF_SIZE) | ||
2067 | goto bad_sense; | ||
2069 | 2068 | ||
2070 | /* Get the data */ | 2069 | /* Get the data */ |
2071 | res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr); | 2070 | res = sd_do_mode_sense(sdp, dbd, modepage, buffer, len, &data, &sshdr); |
@@ -2073,45 +2072,16 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer) | |||
2073 | if (scsi_status_is_good(res)) { | 2072 | if (scsi_status_is_good(res)) { |
2074 | int offset = data.header_length + data.block_descriptor_length; | 2073 | int offset = data.header_length + data.block_descriptor_length; |
2075 | 2074 | ||
2076 | while (offset < len) { | 2075 | if (offset >= SD_BUF_SIZE - 2) { |
2077 | u8 page_code = buffer[offset] & 0x3F; | 2076 | sd_printk(KERN_ERR, sdkp, "Malformed MODE SENSE response\n"); |
2078 | u8 spf = buffer[offset] & 0x40; | 2077 | goto defaults; |
2079 | |||
2080 | if (page_code == 8 || page_code == 6) { | ||
2081 | /* We're interested only in the first 3 bytes. | ||
2082 | */ | ||
2083 | if (len - offset <= 2) { | ||
2084 | sd_printk(KERN_ERR, sdkp, "Incomplete " | ||
2085 | "mode parameter data\n"); | ||
2086 | goto defaults; | ||
2087 | } else { | ||
2088 | modepage = page_code; | ||
2089 | goto Page_found; | ||
2090 | } | ||
2091 | } else { | ||
2092 | /* Go to the next page */ | ||
2093 | if (spf && len - offset > 3) | ||
2094 | offset += 4 + (buffer[offset+2] << 8) + | ||
2095 | buffer[offset+3]; | ||
2096 | else if (!spf && len - offset > 1) | ||
2097 | offset += 2 + buffer[offset+1]; | ||
2098 | else { | ||
2099 | sd_printk(KERN_ERR, sdkp, "Incomplete " | ||
2100 | "mode parameter data\n"); | ||
2101 | goto defaults; | ||
2102 | } | ||
2103 | } | ||
2104 | } | 2078 | } |
2105 | 2079 | ||
2106 | if (modepage == 0x3F) { | 2080 | if ((buffer[offset] & 0x3f) != modepage) { |
2107 | sd_printk(KERN_ERR, sdkp, "No Caching mode page " | ||
2108 | "present\n"); | ||
2109 | goto defaults; | ||
2110 | } else if ((buffer[offset] & 0x3f) != modepage) { | ||
2111 | sd_printk(KERN_ERR, sdkp, "Got wrong page\n"); | 2081 | sd_printk(KERN_ERR, sdkp, "Got wrong page\n"); |
2112 | goto defaults; | 2082 | goto defaults; |
2113 | } | 2083 | } |
2114 | Page_found: | 2084 | |
2115 | if (modepage == 8) { | 2085 | if (modepage == 8) { |
2116 | sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0); | 2086 | sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0); |
2117 | sdkp->RCD = ((buffer[offset + 2] & 0x01) != 0); | 2087 | sdkp->RCD = ((buffer[offset + 2] & 0x01) != 0); |
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c index 7f5a6a86f820..eb7a3e85304f 100644 --- a/drivers/scsi/ses.c +++ b/drivers/scsi/ses.c | |||
@@ -35,9 +35,11 @@ | |||
35 | 35 | ||
36 | struct ses_device { | 36 | struct ses_device { |
37 | unsigned char *page1; | 37 | unsigned char *page1; |
38 | unsigned char *page1_types; | ||
38 | unsigned char *page2; | 39 | unsigned char *page2; |
39 | unsigned char *page10; | 40 | unsigned char *page10; |
40 | short page1_len; | 41 | short page1_len; |
42 | short page1_num_types; | ||
41 | short page2_len; | 43 | short page2_len; |
42 | short page10_len; | 44 | short page10_len; |
43 | }; | 45 | }; |
@@ -110,12 +112,12 @@ static int ses_set_page2_descriptor(struct enclosure_device *edev, | |||
110 | int i, j, count = 0, descriptor = ecomp->number; | 112 | int i, j, count = 0, descriptor = ecomp->number; |
111 | struct scsi_device *sdev = to_scsi_device(edev->edev.parent); | 113 | struct scsi_device *sdev = to_scsi_device(edev->edev.parent); |
112 | struct ses_device *ses_dev = edev->scratch; | 114 | struct ses_device *ses_dev = edev->scratch; |
113 | unsigned char *type_ptr = ses_dev->page1 + 12 + ses_dev->page1[11]; | 115 | unsigned char *type_ptr = ses_dev->page1_types; |
114 | unsigned char *desc_ptr = ses_dev->page2 + 8; | 116 | unsigned char *desc_ptr = ses_dev->page2 + 8; |
115 | 117 | ||
116 | /* Clear everything */ | 118 | /* Clear everything */ |
117 | memset(desc_ptr, 0, ses_dev->page2_len - 8); | 119 | memset(desc_ptr, 0, ses_dev->page2_len - 8); |
118 | for (i = 0; i < ses_dev->page1[10]; i++, type_ptr += 4) { | 120 | for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) { |
119 | for (j = 0; j < type_ptr[1]; j++) { | 121 | for (j = 0; j < type_ptr[1]; j++) { |
120 | desc_ptr += 4; | 122 | desc_ptr += 4; |
121 | if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE && | 123 | if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE && |
@@ -140,12 +142,12 @@ static unsigned char *ses_get_page2_descriptor(struct enclosure_device *edev, | |||
140 | int i, j, count = 0, descriptor = ecomp->number; | 142 | int i, j, count = 0, descriptor = ecomp->number; |
141 | struct scsi_device *sdev = to_scsi_device(edev->edev.parent); | 143 | struct scsi_device *sdev = to_scsi_device(edev->edev.parent); |
142 | struct ses_device *ses_dev = edev->scratch; | 144 | struct ses_device *ses_dev = edev->scratch; |
143 | unsigned char *type_ptr = ses_dev->page1 + 12 + ses_dev->page1[11]; | 145 | unsigned char *type_ptr = ses_dev->page1_types; |
144 | unsigned char *desc_ptr = ses_dev->page2 + 8; | 146 | unsigned char *desc_ptr = ses_dev->page2 + 8; |
145 | 147 | ||
146 | ses_recv_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len); | 148 | ses_recv_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len); |
147 | 149 | ||
148 | for (i = 0; i < ses_dev->page1[10]; i++, type_ptr += 4) { | 150 | for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) { |
149 | for (j = 0; j < type_ptr[1]; j++) { | 151 | for (j = 0; j < type_ptr[1]; j++) { |
150 | desc_ptr += 4; | 152 | desc_ptr += 4; |
151 | if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE && | 153 | if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE && |
@@ -358,7 +360,7 @@ static void ses_enclosure_data_process(struct enclosure_device *edev, | |||
358 | unsigned char *buf = NULL, *type_ptr, *desc_ptr, *addl_desc_ptr = NULL; | 360 | unsigned char *buf = NULL, *type_ptr, *desc_ptr, *addl_desc_ptr = NULL; |
359 | int i, j, page7_len, len, components; | 361 | int i, j, page7_len, len, components; |
360 | struct ses_device *ses_dev = edev->scratch; | 362 | struct ses_device *ses_dev = edev->scratch; |
361 | int types = ses_dev->page1[10]; | 363 | int types = ses_dev->page1_num_types; |
362 | unsigned char *hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL); | 364 | unsigned char *hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL); |
363 | 365 | ||
364 | if (!hdr_buf) | 366 | if (!hdr_buf) |
@@ -390,10 +392,10 @@ static void ses_enclosure_data_process(struct enclosure_device *edev, | |||
390 | len = (desc_ptr[2] << 8) + desc_ptr[3]; | 392 | len = (desc_ptr[2] << 8) + desc_ptr[3]; |
391 | /* skip past overall descriptor */ | 393 | /* skip past overall descriptor */ |
392 | desc_ptr += len + 4; | 394 | desc_ptr += len + 4; |
393 | if (ses_dev->page10) | ||
394 | addl_desc_ptr = ses_dev->page10 + 8; | ||
395 | } | 395 | } |
396 | type_ptr = ses_dev->page1 + 12 + ses_dev->page1[11]; | 396 | if (ses_dev->page10) |
397 | addl_desc_ptr = ses_dev->page10 + 8; | ||
398 | type_ptr = ses_dev->page1_types; | ||
397 | components = 0; | 399 | components = 0; |
398 | for (i = 0; i < types; i++, type_ptr += 4) { | 400 | for (i = 0; i < types; i++, type_ptr += 4) { |
399 | for (j = 0; j < type_ptr[1]; j++) { | 401 | for (j = 0; j < type_ptr[1]; j++) { |
@@ -503,6 +505,7 @@ static int ses_intf_add(struct device *cdev, | |||
503 | u32 result; | 505 | u32 result; |
504 | int i, types, len, components = 0; | 506 | int i, types, len, components = 0; |
505 | int err = -ENOMEM; | 507 | int err = -ENOMEM; |
508 | int num_enclosures; | ||
506 | struct enclosure_device *edev; | 509 | struct enclosure_device *edev; |
507 | struct ses_component *scomp = NULL; | 510 | struct ses_component *scomp = NULL; |
508 | 511 | ||
@@ -530,16 +533,6 @@ static int ses_intf_add(struct device *cdev, | |||
530 | if (result) | 533 | if (result) |
531 | goto recv_failed; | 534 | goto recv_failed; |
532 | 535 | ||
533 | if (hdr_buf[1] != 0) { | ||
534 | /* FIXME: need subenclosure support; I've just never | ||
535 | * seen a device with subenclosures and it makes the | ||
536 | * traversal routines more complex */ | ||
537 | sdev_printk(KERN_ERR, sdev, | ||
538 | "FIXME driver has no support for subenclosures (%d)\n", | ||
539 | hdr_buf[1]); | ||
540 | goto err_free; | ||
541 | } | ||
542 | |||
543 | len = (hdr_buf[2] << 8) + hdr_buf[3] + 4; | 536 | len = (hdr_buf[2] << 8) + hdr_buf[3] + 4; |
544 | buf = kzalloc(len, GFP_KERNEL); | 537 | buf = kzalloc(len, GFP_KERNEL); |
545 | if (!buf) | 538 | if (!buf) |
@@ -549,11 +542,24 @@ static int ses_intf_add(struct device *cdev, | |||
549 | if (result) | 542 | if (result) |
550 | goto recv_failed; | 543 | goto recv_failed; |
551 | 544 | ||
552 | types = buf[10]; | 545 | types = 0; |
553 | 546 | ||
554 | type_ptr = buf + 12 + buf[11]; | 547 | /* we always have one main enclosure and the rest are referred |
548 | * to as secondary subenclosures */ | ||
549 | num_enclosures = buf[1] + 1; | ||
555 | 550 | ||
556 | for (i = 0; i < types; i++, type_ptr += 4) { | 551 | /* begin at the enclosure descriptor */ |
552 | type_ptr = buf + 8; | ||
553 | /* skip all the enclosure descriptors */ | ||
554 | for (i = 0; i < num_enclosures && type_ptr < buf + len; i++) { | ||
555 | types += type_ptr[2]; | ||
556 | type_ptr += type_ptr[3] + 4; | ||
557 | } | ||
558 | |||
559 | ses_dev->page1_types = type_ptr; | ||
560 | ses_dev->page1_num_types = types; | ||
561 | |||
562 | for (i = 0; i < types && type_ptr < buf + len; i++, type_ptr += 4) { | ||
557 | if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE || | 563 | if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE || |
558 | type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE) | 564 | type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE) |
559 | components += type_ptr[1]; | 565 | components += type_ptr[1]; |
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index aefadc6a1607..95019c747cc1 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
@@ -567,7 +567,7 @@ static const struct block_device_operations sr_bdops = | |||
567 | .revalidate_disk = sr_block_revalidate_disk, | 567 | .revalidate_disk = sr_block_revalidate_disk, |
568 | /* | 568 | /* |
569 | * No compat_ioctl for now because sr_block_ioctl never | 569 | * No compat_ioctl for now because sr_block_ioctl never |
570 | * seems to pass arbitary ioctls down to host drivers. | 570 | * seems to pass arbitrary ioctls down to host drivers. |
571 | */ | 571 | */ |
572 | }; | 572 | }; |
573 | 573 | ||
diff --git a/drivers/scsi/sun3_NCR5380.c b/drivers/scsi/sun3_NCR5380.c index 4f0e5485ffde..07eaef1c722b 100644 --- a/drivers/scsi/sun3_NCR5380.c +++ b/drivers/scsi/sun3_NCR5380.c | |||
@@ -467,7 +467,7 @@ static void free_all_tags( void ) | |||
467 | * | 467 | * |
468 | * Parameters: struct scsi_cmnd *cmd | 468 | * Parameters: struct scsi_cmnd *cmd |
469 | * The command to work on. The first scatter buffer's data are | 469 | * The command to work on. The first scatter buffer's data are |
470 | * assumed to be already transfered into ptr/this_residual. | 470 | * assumed to be already transferred into ptr/this_residual. |
471 | */ | 471 | */ |
472 | 472 | ||
473 | static void merge_contiguous_buffers(struct scsi_cmnd *cmd) | 473 | static void merge_contiguous_buffers(struct scsi_cmnd *cmd) |
@@ -1717,7 +1717,7 @@ static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd, | |||
1717 | * bytes to transfer, **data - pointer to data pointer. | 1717 | * bytes to transfer, **data - pointer to data pointer. |
1718 | * | 1718 | * |
1719 | * Returns : -1 when different phase is entered without transferring | 1719 | * Returns : -1 when different phase is entered without transferring |
1720 | * maximum number of bytes, 0 if all bytes are transfered or exit | 1720 | * maximum number of bytes, 0 if all bytes are transferred or exit |
1721 | * is in same phase. | 1721 | * is in same phase. |
1722 | * | 1722 | * |
1723 | * Also, *phase, *count, *data are modified in place. | 1723 | * Also, *phase, *count, *data are modified in place. |
@@ -1904,7 +1904,7 @@ static int do_abort (struct Scsi_Host *host) | |||
1904 | * bytes to transfer, **data - pointer to data pointer. | 1904 | * bytes to transfer, **data - pointer to data pointer. |
1905 | * | 1905 | * |
1906 | * Returns : -1 when different phase is entered without transferring | 1906 | * Returns : -1 when different phase is entered without transferring |
1907 | * maximum number of bytes, 0 if all bytes or transfered or exit | 1907 | * maximum number of bytes, 0 if all bytes or transferred or exit |
1908 | * is in same phase. | 1908 | * is in same phase. |
1909 | * | 1909 | * |
1910 | * Also, *phase, *count, *data are modified in place. | 1910 | * Also, *phase, *count, *data are modified in place. |
diff --git a/drivers/scsi/sym53c416.c b/drivers/scsi/sym53c416.c index 190107ae120b..012c86edd59f 100644 --- a/drivers/scsi/sym53c416.c +++ b/drivers/scsi/sym53c416.c | |||
@@ -774,7 +774,7 @@ static int sym53c416_host_reset(Scsi_Cmnd *SCpnt) | |||
774 | 774 | ||
775 | /* printk("sym53c416_reset\n"); */ | 775 | /* printk("sym53c416_reset\n"); */ |
776 | base = SCpnt->device->host->io_port; | 776 | base = SCpnt->device->host->io_port; |
777 | /* search scsi_id - fixme, we shouldnt need to iterate for this! */ | 777 | /* search scsi_id - fixme, we shouldn't need to iterate for this! */ |
778 | for(i = 0; i < host_index && scsi_id == -1; i++) | 778 | for(i = 0; i < host_index && scsi_id == -1; i++) |
779 | if(hosts[i].base == base) | 779 | if(hosts[i].base == base) |
780 | scsi_id = hosts[i].scsi_id; | 780 | scsi_id = hosts[i].scsi_id; |
diff --git a/drivers/scsi/sym53c8xx_2/sym_fw1.h b/drivers/scsi/sym53c8xx_2/sym_fw1.h index 7b08d6caaa99..63952ee300b5 100644 --- a/drivers/scsi/sym53c8xx_2/sym_fw1.h +++ b/drivers/scsi/sym53c8xx_2/sym_fw1.h | |||
@@ -1449,7 +1449,7 @@ static struct SYM_FWB_SCR SYM_FWB_SCR = { | |||
1449 | PADDR_B (msg_weird_seen), | 1449 | PADDR_B (msg_weird_seen), |
1450 | /* | 1450 | /* |
1451 | * We donnot handle extended messages from SCRIPTS. | 1451 | * We donnot handle extended messages from SCRIPTS. |
1452 | * Read the amount of data correponding to the | 1452 | * Read the amount of data corresponding to the |
1453 | * message length and call the C code. | 1453 | * message length and call the C code. |
1454 | */ | 1454 | */ |
1455 | SCR_COPY (1), | 1455 | SCR_COPY (1), |
diff --git a/drivers/scsi/sym53c8xx_2/sym_fw2.h b/drivers/scsi/sym53c8xx_2/sym_fw2.h index ae1fb179b88e..c87d72443a16 100644 --- a/drivers/scsi/sym53c8xx_2/sym_fw2.h +++ b/drivers/scsi/sym53c8xx_2/sym_fw2.h | |||
@@ -1326,7 +1326,7 @@ static struct SYM_FWB_SCR SYM_FWB_SCR = { | |||
1326 | PADDR_B (msg_weird_seen), | 1326 | PADDR_B (msg_weird_seen), |
1327 | /* | 1327 | /* |
1328 | * We donnot handle extended messages from SCRIPTS. | 1328 | * We donnot handle extended messages from SCRIPTS. |
1329 | * Read the amount of data correponding to the | 1329 | * Read the amount of data corresponding to the |
1330 | * message length and call the C code. | 1330 | * message length and call the C code. |
1331 | */ | 1331 | */ |
1332 | SCR_STORE_REL (scratcha, 1), | 1332 | SCR_STORE_REL (scratcha, 1), |
diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index 2c3e89ddf069..d92fe4037e94 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c | |||
@@ -2457,7 +2457,7 @@ static void sym_int_ma (struct sym_hcb *np) | |||
2457 | } | 2457 | } |
2458 | 2458 | ||
2459 | /* | 2459 | /* |
2460 | * The data in the dma fifo has not been transfered to | 2460 | * The data in the dma fifo has not been transferred to |
2461 | * the target -> add the amount to the rest | 2461 | * the target -> add the amount to the rest |
2462 | * and clear the data. | 2462 | * and clear the data. |
2463 | * Check the sstat2 register in case of wide transfer. | 2463 | * Check the sstat2 register in case of wide transfer. |
@@ -5094,7 +5094,7 @@ fail: | |||
5094 | } | 5094 | } |
5095 | 5095 | ||
5096 | /* | 5096 | /* |
5097 | * Lun control block deallocation. Returns the number of valid remaing LCBs | 5097 | * Lun control block deallocation. Returns the number of valid remaining LCBs |
5098 | * for the target. | 5098 | * for the target. |
5099 | */ | 5099 | */ |
5100 | int sym_free_lcb(struct sym_hcb *np, u_char tn, u_char ln) | 5100 | int sym_free_lcb(struct sym_hcb *np, u_char tn, u_char ln) |
diff --git a/drivers/scsi/sym53c8xx_2/sym_malloc.c b/drivers/scsi/sym53c8xx_2/sym_malloc.c index 883cac10daf9..6f9af0de7ec3 100644 --- a/drivers/scsi/sym53c8xx_2/sym_malloc.c +++ b/drivers/scsi/sym53c8xx_2/sym_malloc.c | |||
@@ -50,7 +50,7 @@ | |||
50 | * from the SCRIPTS code. In addition, cache line alignment | 50 | * from the SCRIPTS code. In addition, cache line alignment |
51 | * is guaranteed for power of 2 cache line size. | 51 | * is guaranteed for power of 2 cache line size. |
52 | * | 52 | * |
53 | * This allocator has been developped for the Linux sym53c8xx | 53 | * This allocator has been developed for the Linux sym53c8xx |
54 | * driver, since this O/S does not provide naturally aligned | 54 | * driver, since this O/S does not provide naturally aligned |
55 | * allocations. | 55 | * allocations. |
56 | * It has the advantage of allowing the driver to use private | 56 | * It has the advantage of allowing the driver to use private |
diff --git a/drivers/scsi/ultrastor.c b/drivers/scsi/ultrastor.c index 0571ef9639cb..9f4b58b7daad 100644 --- a/drivers/scsi/ultrastor.c +++ b/drivers/scsi/ultrastor.c | |||
@@ -138,6 +138,7 @@ | |||
138 | #include <linux/spinlock.h> | 138 | #include <linux/spinlock.h> |
139 | #include <linux/stat.h> | 139 | #include <linux/stat.h> |
140 | #include <linux/bitops.h> | 140 | #include <linux/bitops.h> |
141 | #include <linux/delay.h> | ||
141 | 142 | ||
142 | #include <asm/io.h> | 143 | #include <asm/io.h> |
143 | #include <asm/system.h> | 144 | #include <asm/system.h> |
diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c index 5f697e0bd009..4468ae3610f7 100644 --- a/drivers/scsi/wd33c93.c +++ b/drivers/scsi/wd33c93.c | |||
@@ -1843,7 +1843,7 @@ check_setup_args(char *key, int *flags, int *val, char *buf) | |||
1843 | * | 1843 | * |
1844 | * The original driver used to rely on a fixed sx_table, containing periods | 1844 | * The original driver used to rely on a fixed sx_table, containing periods |
1845 | * for (only) the lower limits of the respective input-clock-frequency ranges | 1845 | * for (only) the lower limits of the respective input-clock-frequency ranges |
1846 | * (8-10/12-15/16-20 MHz). Although it seems, that no problems ocurred with | 1846 | * (8-10/12-15/16-20 MHz). Although it seems, that no problems occurred with |
1847 | * this setting so far, it might be desirable to adjust the transfer periods | 1847 | * this setting so far, it might be desirable to adjust the transfer periods |
1848 | * closer to the really attached, possibly 25% higher, input-clock, since | 1848 | * closer to the really attached, possibly 25% higher, input-clock, since |
1849 | * - the wd33c93 may really use a significant shorter period, than it has | 1849 | * - the wd33c93 may really use a significant shorter period, than it has |
diff --git a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c index db451ae0a368..9ee0afef2d16 100644 --- a/drivers/scsi/wd7000.c +++ b/drivers/scsi/wd7000.c | |||
@@ -837,7 +837,7 @@ static inline Scb *alloc_scbs(struct Scsi_Host *host, int needed) | |||
837 | } | 837 | } |
838 | } | 838 | } |
839 | 839 | ||
840 | /* Take the lock, then check we didnt get beaten, if so try again */ | 840 | /* Take the lock, then check we didn't get beaten, if so try again */ |
841 | spin_lock_irqsave(&scbpool_lock, flags); | 841 | spin_lock_irqsave(&scbpool_lock, flags); |
842 | if (freescbs < needed) { | 842 | if (freescbs < needed) { |
843 | spin_unlock_irqrestore(&scbpool_lock, flags); | 843 | spin_unlock_irqrestore(&scbpool_lock, flags); |