diff options
author | adam radford <aradford@gmail.com> | 2006-04-11 14:25:09 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-04-13 14:27:38 -0400 |
commit | 1e08dcb39c6b95ec84fc8bad97d5bdce879b76c9 (patch) | |
tree | b96ddfaa7695f83d2bc409bf72a8e2c577ce7212 /drivers/scsi | |
parent | e36e0c80137af8f012528938dab2970c26d5ec4c (diff) |
[SCSI] 3ware 9000 disable local irqs during kmap_atomic
Equivalent of the same patch for the 3w-xxxx driver.
Signed-off-by: Adam Radford <linuxraid@amcc.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/3w-9xxx.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index 0d2b447c50ed..caeb6d246e57 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c | |||
@@ -65,6 +65,7 @@ | |||
65 | 2.26.02.005 - Fix use_sg == 0 mapping on systems with 4GB or higher. | 65 | 2.26.02.005 - Fix use_sg == 0 mapping on systems with 4GB or higher. |
66 | 2.26.02.006 - Fix 9550SX pchip reset timeout. | 66 | 2.26.02.006 - Fix 9550SX pchip reset timeout. |
67 | Add big endian support. | 67 | Add big endian support. |
68 | 2.26.02.007 - Disable local interrupts during kmap/unmap_atomic(). | ||
68 | */ | 69 | */ |
69 | 70 | ||
70 | #include <linux/module.h> | 71 | #include <linux/module.h> |
@@ -88,7 +89,7 @@ | |||
88 | #include "3w-9xxx.h" | 89 | #include "3w-9xxx.h" |
89 | 90 | ||
90 | /* Globals */ | 91 | /* Globals */ |
91 | #define TW_DRIVER_VERSION "2.26.02.006" | 92 | #define TW_DRIVER_VERSION "2.26.02.007" |
92 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; | 93 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; |
93 | static unsigned int twa_device_extension_count; | 94 | static unsigned int twa_device_extension_count; |
94 | static int twa_major = -1; | 95 | static int twa_major = -1; |
@@ -1942,9 +1943,13 @@ static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int re | |||
1942 | } | 1943 | } |
1943 | if (tw_dev->srb[request_id]->use_sg == 1) { | 1944 | if (tw_dev->srb[request_id]->use_sg == 1) { |
1944 | struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer; | 1945 | struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer; |
1945 | char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 1946 | char *buf; |
1947 | unsigned long flags = 0; | ||
1948 | local_irq_save(flags); | ||
1949 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | ||
1946 | memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length); | 1950 | memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length); |
1947 | kunmap_atomic(buf - sg->offset, KM_IRQ0); | 1951 | kunmap_atomic(buf - sg->offset, KM_IRQ0); |
1952 | local_irq_restore(flags); | ||
1948 | } | 1953 | } |
1949 | } | 1954 | } |
1950 | } /* End twa_scsiop_execute_scsi_complete() */ | 1955 | } /* End twa_scsiop_execute_scsi_complete() */ |