diff options
Diffstat (limited to 'drivers/scsi/3w-9xxx.c')
-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() */ |