diff options
-rw-r--r-- | Documentation/scsi/ChangeLog.megaraid | 16 | ||||
-rw-r--r-- | drivers/scsi/megaraid/megaraid_mbox.c | 140 | ||||
-rw-r--r-- | drivers/scsi/megaraid/megaraid_mbox.h | 4 |
3 files changed, 130 insertions, 30 deletions
diff --git a/Documentation/scsi/ChangeLog.megaraid b/Documentation/scsi/ChangeLog.megaraid index a056bbe67c7e..37796fe45bd0 100644 --- a/Documentation/scsi/ChangeLog.megaraid +++ b/Documentation/scsi/ChangeLog.megaraid | |||
@@ -1,3 +1,19 @@ | |||
1 | Release Date : Thu Nov 16 15:32:35 EST 2006 - | ||
2 | Sumant Patro <sumant.patro@lsi.com> | ||
3 | Current Version : 2.20.5.1 (scsi module), 2.20.2.6 (cmm module) | ||
4 | Older Version : 2.20.4.9 (scsi module), 2.20.2.6 (cmm module) | ||
5 | |||
6 | 1. Changes in Initialization to fix kdump failure. | ||
7 | Send SYNC command on loading. | ||
8 | This command clears the pending commands in the adapter | ||
9 | and re-initialize its internal RAID structure. | ||
10 | Without this change, megaraid driver either panics or fails to | ||
11 | initialize the adapter during kdump's second kernel boot | ||
12 | if there are pending commands or interrupts from other devices | ||
13 | sharing the same IRQ. | ||
14 | 2. Authors email-id domain name changed from lsil.com to lsi.com. | ||
15 | Also modified the MODULE_AUTHOR to megaraidlinux@lsi.com | ||
16 | |||
1 | Release Date : Fri May 19 09:31:45 EST 2006 - Seokmann Ju <sju@lsil.com> | 17 | Release Date : Fri May 19 09:31:45 EST 2006 - Seokmann Ju <sju@lsil.com> |
2 | Current Version : 2.20.4.9 (scsi module), 2.20.2.6 (cmm module) | 18 | Current Version : 2.20.4.9 (scsi module), 2.20.2.6 (cmm module) |
3 | Older Version : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module) | 19 | Older Version : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module) |
diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c index 7bac86dda88f..49ee50cc4e84 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.c +++ b/drivers/scsi/megaraid/megaraid_mbox.c | |||
@@ -10,13 +10,13 @@ | |||
10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
11 | * | 11 | * |
12 | * FILE : megaraid_mbox.c | 12 | * FILE : megaraid_mbox.c |
13 | * Version : v2.20.4.9 (Jul 16 2006) | 13 | * Version : v2.20.5.1 (Nov 16 2006) |
14 | * | 14 | * |
15 | * Authors: | 15 | * Authors: |
16 | * Atul Mukker <Atul.Mukker@lsil.com> | 16 | * Atul Mukker <Atul.Mukker@lsi.com> |
17 | * Sreenivas Bagalkote <Sreenivas.Bagalkote@lsil.com> | 17 | * Sreenivas Bagalkote <Sreenivas.Bagalkote@lsi.com> |
18 | * Manoj Jose <Manoj.Jose@lsil.com> | 18 | * Manoj Jose <Manoj.Jose@lsi.com> |
19 | * Seokmann Ju <Seokmann.Ju@lsil.com> | 19 | * Seokmann Ju |
20 | * | 20 | * |
21 | * List of supported controllers | 21 | * List of supported controllers |
22 | * | 22 | * |
@@ -107,6 +107,7 @@ static int megaraid_mbox_support_random_del(adapter_t *); | |||
107 | static int megaraid_mbox_get_max_sg(adapter_t *); | 107 | static int megaraid_mbox_get_max_sg(adapter_t *); |
108 | static void megaraid_mbox_enum_raid_scsi(adapter_t *); | 108 | static void megaraid_mbox_enum_raid_scsi(adapter_t *); |
109 | static void megaraid_mbox_flush_cache(adapter_t *); | 109 | static void megaraid_mbox_flush_cache(adapter_t *); |
110 | static int megaraid_mbox_fire_sync_cmd(adapter_t *); | ||
110 | 111 | ||
111 | static void megaraid_mbox_display_scb(adapter_t *, scb_t *); | 112 | static void megaraid_mbox_display_scb(adapter_t *, scb_t *); |
112 | static void megaraid_mbox_setup_device_map(adapter_t *); | 113 | static void megaraid_mbox_setup_device_map(adapter_t *); |
@@ -137,7 +138,7 @@ static int wait_till_fw_empty(adapter_t *); | |||
137 | 138 | ||
138 | 139 | ||
139 | 140 | ||
140 | MODULE_AUTHOR("sju@lsil.com"); | 141 | MODULE_AUTHOR("megaraidlinux@lsi.com"); |
141 | MODULE_DESCRIPTION("LSI Logic MegaRAID Mailbox Driver"); | 142 | MODULE_DESCRIPTION("LSI Logic MegaRAID Mailbox Driver"); |
142 | MODULE_LICENSE("GPL"); | 143 | MODULE_LICENSE("GPL"); |
143 | MODULE_VERSION(MEGARAID_VERSION); | 144 | MODULE_VERSION(MEGARAID_VERSION); |
@@ -779,33 +780,39 @@ megaraid_init_mbox(adapter_t *adapter) | |||
779 | goto out_release_regions; | 780 | goto out_release_regions; |
780 | } | 781 | } |
781 | 782 | ||
782 | // | 783 | /* initialize the mutual exclusion lock for the mailbox */ |
783 | // Setup the rest of the soft state using the library of FW routines | 784 | spin_lock_init(&raid_dev->mailbox_lock); |
784 | // | 785 | |
786 | /* allocate memory required for commands */ | ||
787 | if (megaraid_alloc_cmd_packets(adapter) != 0) | ||
788 | goto out_iounmap; | ||
785 | 789 | ||
786 | // request IRQ and register the interrupt service routine | 790 | /* |
791 | * Issue SYNC cmd to flush the pending cmds in the adapter | ||
792 | * and initialize its internal state | ||
793 | */ | ||
794 | |||
795 | if (megaraid_mbox_fire_sync_cmd(adapter)) | ||
796 | con_log(CL_ANN, ("megaraid: sync cmd failed\n")); | ||
797 | |||
798 | /* | ||
799 | * Setup the rest of the soft state using the library of | ||
800 | * FW routines | ||
801 | */ | ||
802 | |||
803 | /* request IRQ and register the interrupt service routine */ | ||
787 | if (request_irq(adapter->irq, megaraid_isr, IRQF_SHARED, "megaraid", | 804 | if (request_irq(adapter->irq, megaraid_isr, IRQF_SHARED, "megaraid", |
788 | adapter)) { | 805 | adapter)) { |
789 | 806 | ||
790 | con_log(CL_ANN, (KERN_WARNING | 807 | con_log(CL_ANN, (KERN_WARNING |
791 | "megaraid: Couldn't register IRQ %d!\n", adapter->irq)); | 808 | "megaraid: Couldn't register IRQ %d!\n", adapter->irq)); |
809 | goto out_alloc_cmds; | ||
792 | 810 | ||
793 | goto out_iounmap; | ||
794 | } | ||
795 | |||
796 | |||
797 | // initialize the mutual exclusion lock for the mailbox | ||
798 | spin_lock_init(&raid_dev->mailbox_lock); | ||
799 | |||
800 | // allocate memory required for commands | ||
801 | if (megaraid_alloc_cmd_packets(adapter) != 0) { | ||
802 | goto out_free_irq; | ||
803 | } | 811 | } |
804 | 812 | ||
805 | // Product info | 813 | // Product info |
806 | if (megaraid_mbox_product_info(adapter) != 0) { | 814 | if (megaraid_mbox_product_info(adapter) != 0) |
807 | goto out_alloc_cmds; | 815 | goto out_free_irq; |
808 | } | ||
809 | 816 | ||
810 | // Do we support extended CDBs | 817 | // Do we support extended CDBs |
811 | adapter->max_cdb_sz = 10; | 818 | adapter->max_cdb_sz = 10; |
@@ -874,9 +881,8 @@ megaraid_init_mbox(adapter_t *adapter) | |||
874 | * Allocate resources required to issue FW calls, when sysfs is | 881 | * Allocate resources required to issue FW calls, when sysfs is |
875 | * accessed | 882 | * accessed |
876 | */ | 883 | */ |
877 | if (megaraid_sysfs_alloc_resources(adapter) != 0) { | 884 | if (megaraid_sysfs_alloc_resources(adapter) != 0) |
878 | goto out_alloc_cmds; | 885 | goto out_free_irq; |
879 | } | ||
880 | 886 | ||
881 | // Set the DMA mask to 64-bit. All supported controllers as capable of | 887 | // Set the DMA mask to 64-bit. All supported controllers as capable of |
882 | // DMA in this range | 888 | // DMA in this range |
@@ -920,10 +926,10 @@ megaraid_init_mbox(adapter_t *adapter) | |||
920 | 926 | ||
921 | out_free_sysfs_res: | 927 | out_free_sysfs_res: |
922 | megaraid_sysfs_free_resources(adapter); | 928 | megaraid_sysfs_free_resources(adapter); |
923 | out_alloc_cmds: | ||
924 | megaraid_free_cmd_packets(adapter); | ||
925 | out_free_irq: | 929 | out_free_irq: |
926 | free_irq(adapter->irq, adapter); | 930 | free_irq(adapter->irq, adapter); |
931 | out_alloc_cmds: | ||
932 | megaraid_free_cmd_packets(adapter); | ||
927 | out_iounmap: | 933 | out_iounmap: |
928 | iounmap(raid_dev->baseaddr); | 934 | iounmap(raid_dev->baseaddr); |
929 | out_release_regions: | 935 | out_release_regions: |
@@ -3380,6 +3386,84 @@ megaraid_mbox_flush_cache(adapter_t *adapter) | |||
3380 | 3386 | ||
3381 | 3387 | ||
3382 | /** | 3388 | /** |
3389 | * megaraid_mbox_fire_sync_cmd - fire the sync cmd | ||
3390 | * @param adapter : soft state for the controller | ||
3391 | * | ||
3392 | * Clears the pending cmds in FW and reinits its RAID structs | ||
3393 | */ | ||
3394 | static int | ||
3395 | megaraid_mbox_fire_sync_cmd(adapter_t *adapter) | ||
3396 | { | ||
3397 | mbox_t *mbox; | ||
3398 | uint8_t raw_mbox[sizeof(mbox_t)]; | ||
3399 | mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter); | ||
3400 | mbox64_t *mbox64; | ||
3401 | int status = 0; | ||
3402 | int i; | ||
3403 | uint32_t dword; | ||
3404 | |||
3405 | mbox = (mbox_t *)raw_mbox; | ||
3406 | |||
3407 | memset((caddr_t)raw_mbox, 0, sizeof(mbox_t)); | ||
3408 | |||
3409 | raw_mbox[0] = 0xFF; | ||
3410 | |||
3411 | mbox64 = raid_dev->mbox64; | ||
3412 | mbox = raid_dev->mbox; | ||
3413 | |||
3414 | /* Wait until mailbox is free */ | ||
3415 | if (megaraid_busywait_mbox(raid_dev) != 0) { | ||
3416 | status = 1; | ||
3417 | goto blocked_mailbox; | ||
3418 | } | ||
3419 | |||
3420 | /* Copy mailbox data into host structure */ | ||
3421 | memcpy((caddr_t)mbox, (caddr_t)raw_mbox, 16); | ||
3422 | mbox->cmdid = 0xFE; | ||
3423 | mbox->busy = 1; | ||
3424 | mbox->poll = 0; | ||
3425 | mbox->ack = 0; | ||
3426 | mbox->numstatus = 0; | ||
3427 | mbox->status = 0; | ||
3428 | |||
3429 | wmb(); | ||
3430 | WRINDOOR(raid_dev, raid_dev->mbox_dma | 0x1); | ||
3431 | |||
3432 | /* Wait for maximum 1 min for status to post. | ||
3433 | * If the Firmware SUPPORTS the ABOVE COMMAND, | ||
3434 | * mbox->cmd will be set to 0 | ||
3435 | * else | ||
3436 | * the firmware will reject the command with | ||
3437 | * mbox->numstatus set to 1 | ||
3438 | */ | ||
3439 | |||
3440 | i = 0; | ||
3441 | status = 0; | ||
3442 | while (!mbox->numstatus && mbox->cmd == 0xFF) { | ||
3443 | rmb(); | ||
3444 | msleep(1); | ||
3445 | i++; | ||
3446 | if (i > 1000 * 60) { | ||
3447 | status = 1; | ||
3448 | break; | ||
3449 | } | ||
3450 | } | ||
3451 | if (mbox->numstatus == 1) | ||
3452 | status = 1; /*cmd not supported*/ | ||
3453 | |||
3454 | /* Check for interrupt line */ | ||
3455 | dword = RDOUTDOOR(raid_dev); | ||
3456 | WROUTDOOR(raid_dev, dword); | ||
3457 | WRINDOOR(raid_dev,2); | ||
3458 | |||
3459 | return status; | ||
3460 | |||
3461 | blocked_mailbox: | ||
3462 | con_log(CL_ANN, (KERN_WARNING "megaraid: blocked mailbox\n")); | ||
3463 | return status; | ||
3464 | } | ||
3465 | |||
3466 | /** | ||
3383 | * megaraid_mbox_display_scb - display SCB information, mostly debug purposes | 3467 | * megaraid_mbox_display_scb - display SCB information, mostly debug purposes |
3384 | * @param adapter : controllers' soft state | 3468 | * @param adapter : controllers' soft state |
3385 | * @param scb : SCB to be displayed | 3469 | * @param scb : SCB to be displayed |
diff --git a/drivers/scsi/megaraid/megaraid_mbox.h b/drivers/scsi/megaraid/megaraid_mbox.h index 2b5a3285f799..963e0d2dbd97 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.h +++ b/drivers/scsi/megaraid/megaraid_mbox.h | |||
@@ -21,8 +21,8 @@ | |||
21 | #include "megaraid_ioctl.h" | 21 | #include "megaraid_ioctl.h" |
22 | 22 | ||
23 | 23 | ||
24 | #define MEGARAID_VERSION "2.20.4.9" | 24 | #define MEGARAID_VERSION "2.20.5.1" |
25 | #define MEGARAID_EXT_VERSION "(Release Date: Sun Jul 16 12:27:22 EST 2006)" | 25 | #define MEGARAID_EXT_VERSION "(Release Date: Thu Nov 16 15:32:35 EST 2006)" |
26 | 26 | ||
27 | 27 | ||
28 | /* | 28 | /* |