Author: marcus                       Date: Sun Apr  6 14:06:32 2008 GMT
Module: SOURCES                       Tag: LINUX_2_6_16
---- Log message:
- 2.26.02.010

---- Files affected:
SOURCES:
   linux-3w-9xxx.patch (1.1 -> 1.1.2.1) 

---- Diffs:

================================================================
Index: SOURCES/linux-3w-9xxx.patch
diff -u SOURCES/linux-3w-9xxx.patch:1.1 SOURCES/linux-3w-9xxx.patch:1.1.2.1
--- SOURCES/linux-3w-9xxx.patch:1.1     Fri Jun  1 00:23:33 2007
+++ SOURCES/linux-3w-9xxx.patch Sun Apr  6 16:06:27 2008
@@ -1,6 +1,6 @@
 diff -uNr linux-2.6.16.orig/drivers/scsi/3w-9xxx.c 
linux-2.6.16/drivers/scsi/3w-9xxx.c
---- linux-2.6.16.orig/drivers/scsi/3w-9xxx.c   2007-05-31 23:13:02.123552000 
+0200
-+++ linux-2.6.16/drivers/scsi/3w-9xxx.c        2006-10-20 22:22:02.000000000 
+0200
+--- linux-2.6.16.orig/drivers/scsi/3w-9xxx.c   2008-04-06 09:38:09.863305000 
+0000
++++ linux-2.6.16/drivers/scsi/3w-9xxx.c        2008-04-06 09:36:47.000000000 
+0000
 @@ -2,8 +2,9 @@
     3w-9xxx.c -- 3ware 9000 Storage Controller device driver for Linux.
  
@@ -8,11 +8,11 @@
 +   Modifications By: Tom Couch <[EMAIL PROTECTED]>
  
 -   Copyright (C) 2004-2005 Applied Micro Circuits Corporation.
-+   Copyright (C) 2004-2006 Applied Micro Circuits Corporation.
++   Copyright (C) 2004-2007 Applied Micro Circuits Corporation.
  
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
-@@ -62,6 +63,12 @@
+@@ -62,6 +63,14 @@
     2.26.02.003 - Correctly handle single sgl's with use_sg=1.
     2.26.02.004 - Add support for 9550SX controllers.
     2.26.02.005 - Fix use_sg == 0 mapping on systems with 4GB or higher.
@@ -22,19 +22,35 @@
 +   2.26.02.008 - Free irq handler in __twa_shutdown().
 +                 Serialize reset code.
 +                 Add support for 9650SE controllers.
++   2.26.02.009 - Fix dma mask setting to fallback to 32-bit if 64-bit fails.
++   2.26.02.010 - Add support for 9690SA controllers.
  */
  
  #include <linux/module.h>
-@@ -85,7 +92,7 @@
+@@ -85,7 +94,7 @@
  #include "3w-9xxx.h"
  
  /* Globals */
 -#define TW_DRIVER_VERSION "2.26.02.007"
-+#define TW_DRIVER_VERSION "2.26.02.008"
++#define TW_DRIVER_VERSION "2.26.02.010"
  static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT];
  static unsigned int twa_device_extension_count;
  static int twa_major = -1;
-@@ -208,7 +215,7 @@
+@@ -117,11 +126,11 @@
+                             unsigned short *fw_on_ctlr_branch, 
+                             unsigned short *fw_on_ctlr_build, 
+                             u32 *init_connect_result);
+-static void twa_load_sgl(TW_Command_Full *full_command_packet, int 
request_id, dma_addr_t dma_handle, int length);
++static void twa_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full 
*full_command_packet, int request_id, dma_addr_t dma_handle, int length);
+ static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int 
seconds);
+ static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int 
seconds);
+ static int twa_post_command_packet(TW_Device_Extension *tw_dev, int 
request_id, char internal);
+-static int twa_reset_device_extension(TW_Device_Extension *tw_dev, int 
ioctl_reset);
++static int twa_reset_device_extension(TW_Device_Extension *tw_dev);
+ static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset);
+ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int 
request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg);
+ static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int 
request_id);
+@@ -208,7 +217,7 @@
  
        header = (TW_Command_Apache_Header 
*)tw_dev->generic_buffer_virt[request_id];
        tw_dev->posted_request_count--;
@@ -43,7 +59,7 @@
        full_command_packet = tw_dev->command_packet_virt[request_id];
        command_packet = &full_command_packet->command.oldcommand;
  
-@@ -305,7 +312,7 @@
+@@ -305,7 +314,7 @@
  
                tw_dev->posted_request_count--;
                header = (TW_Command_Apache_Header 
*)tw_dev->generic_buffer_virt[request_id];
@@ -52,7 +68,7 @@
                queue = 0;
                count++;
  
-@@ -365,7 +372,7 @@
+@@ -365,7 +374,7 @@
                        tw_dev->aen_clobber = 1;
        }
  
@@ -61,7 +77,7 @@
        memset(event, 0, sizeof(TW_Event));
  
        event->severity = TW_SEV_OUT(header->status_block.severity__reserved);
-@@ -382,7 +389,7 @@
+@@ -382,7 +391,7 @@
  
        header->err_specific_desc[sizeof(header->err_specific_desc) - 1] = '\0';
        event->parameter_len = strlen(header->err_specific_desc);
@@ -70,7 +86,7 @@
        if (event->severity != TW_AEN_SEVERITY_DEBUG)
                printk(KERN_WARNING "3w-9xxx:%s AEN: %s (0x%02X:0x%04X): 
%s:%s.\n",
                       host,
-@@ -462,24 +469,24 @@
+@@ -462,24 +471,24 @@
        command_packet = &full_command_packet->command.oldcommand;
        command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_SET_PARAM);
        command_packet->request_id = request_id;
@@ -102,7 +118,7 @@
  
        memcpy(param->data, &schedulertime, sizeof(u32));
  
-@@ -562,9 +569,9 @@
+@@ -562,9 +571,9 @@
                goto out;
        }
  
@@ -115,7 +131,7 @@
  
        /* Try base mode compatibility */
        if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
-@@ -586,10 +593,23 @@
+@@ -586,10 +595,23 @@
                        }
                        goto out;
                }
@@ -143,7 +159,7 @@
        retval = 0;
  out:
        return retval;
-@@ -627,7 +647,7 @@
+@@ -627,7 +649,7 @@
                goto out2;
  
        /* Check data buffer size */
@@ -152,7 +168,16 @@
                retval = TW_IOCTL_ERROR_OS_EINVAL;
                goto out2;
        }
-@@ -676,13 +696,6 @@
+@@ -663,7 +685,7 @@
+               full_command_packet = &tw_ioctl->firmware_command;
+ 
+               /* Load request id and sglist for both command types */
+-              twa_load_sgl(full_command_packet, request_id, dma_handle, 
data_buffer_length_adjusted);
++              twa_load_sgl(tw_dev, full_command_packet, request_id, 
dma_handle, data_buffer_length_adjusted);
+ 
+               memcpy(tw_dev->command_packet_virt[request_id], 
&(tw_ioctl->firmware_command), sizeof(TW_Command_Full));
+ 
+@@ -676,26 +698,14 @@
                /* Now wait for command to complete */
                timeout = wait_event_timeout(tw_dev->ioctl_wqueue, 
tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout);
  
@@ -166,8 +191,9 @@
                /* We timed out, and didn't get an interrupt */
                if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) {
                        /* Now we need to reset the board */
-@@ -690,11 +703,6 @@
-                              tw_dev->host->host_no, TW_DRIVER, 0xc,
+                       printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: 
(0x%02X:0x%04X): Character ioctl (0x%x) timed out, resetting card.\n",
+-                             tw_dev->host->host_no, TW_DRIVER, 0xc,
++                             tw_dev->host->host_no, TW_DRIVER, 0x37,
                               cmd);
                        retval = TW_IOCTL_ERROR_OS_EIO;
 -                      spin_lock_irqsave(tw_dev->host->host_lock, flags);
@@ -175,10 +201,12 @@
 -                      twa_free_request_id(tw_dev, request_id);
 -                      tw_dev->posted_request_count--;
 -                      spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
-                       twa_reset_device_extension(tw_dev, 1);
+-                      twa_reset_device_extension(tw_dev, 1);
++                      twa_reset_device_extension(tw_dev);
                        goto out3;
                }
-@@ -713,16 +721,7 @@
+ 
+@@ -713,16 +723,7 @@
                tw_ioctl->driver_command.status = 0;
                /* Copy compatiblity struct into ioctl data buffer */
                tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer;
@@ -196,17 +224,19 @@
                break;
        case TW_IOCTL_GET_LAST_EVENT:
                if (tw_dev->event_queue_wrapped) {
-@@ -891,7 +890,8 @@
+@@ -891,7 +892,10 @@
        }
  
        if (status_reg_value & TW_STATUS_QUEUE_ERROR) {
 -              TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue 
Error: clearing");
-+              if ((tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9650SE) 
|| (!test_bit(TW_IN_RESET, &tw_dev->flags)))
++              if (((tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9650SE) 
&&
++                   (tw_dev->tw_pci_dev->device != 
PCI_DEVICE_ID_3WARE_9690SA)) ||
++                  (!test_bit(TW_IN_RESET, &tw_dev->flags)))
 +                      TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller 
Queue Error: clearing");
                writel(TW_CONTROL_CLEAR_QUEUE_ERROR, 
TW_CONTROL_REG_ADDR(tw_dev));
        }
  
-@@ -931,26 +931,21 @@
+@@ -931,26 +935,20 @@
  /* This function will clear the pchip/response queue on 9550SX */
  static int twa_empty_response_queue_large(TW_Device_Extension *tw_dev)
  {
@@ -220,8 +250,7 @@
 +      int retval = 1;
  
 -              while (((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 
0) && (count < TW_MAX_RESPONSE_DRAIN)) {
-+      if ((tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) ||
-+          (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE)) {
++      if (tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9000) {
 +              before = jiffies;
 +              while ((response_que_value & TW_9550SX_DRAIN_COMPLETED) != 
TW_9550SX_DRAIN_COMPLETED) {
                        response_que_value = 
readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev));
@@ -244,7 +273,7 @@
                retval = 0;
        } else
                retval = 0;
-@@ -972,7 +967,7 @@
+@@ -972,7 +970,7 @@
        error_str = 
&(full_command_packet->header.err_specific_desc[strlen(full_command_packet->header.err_specific_desc)
 + 1]);
  
        /* Don't print error for Logical unit not supported during rollcall */
@@ -253,7 +282,7 @@
        if ((error != TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED) && (error != 
TW_ERROR_UNIT_OFFLINE)) {
                if (print_host)
                        printk(KERN_WARNING "3w-9xxx: scsi%d: ERROR: 
(0x%02X:0x%04X): %s:%s.\n",
-@@ -1030,7 +1025,7 @@
+@@ -1030,7 +1028,7 @@
        tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH;
  } /* End twa_free_request_id() */
  
@@ -262,7 +291,7 @@
  static void *twa_get_param(TW_Device_Extension *tw_dev, int request_id, int 
table_id, int parameter_id, int parameter_size_bytes)
  {
        TW_Command_Full *full_command_packet;
-@@ -1047,18 +1042,18 @@
+@@ -1047,18 +1045,18 @@
        command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM);
        command_packet->size              = TW_COMMAND_SIZE;
        command_packet->request_id        = request_id;
@@ -287,7 +316,7 @@
  
        /* Post the command packet to the board */
        twa_post_command_packet(tw_dev, request_id, 1);
-@@ -1107,18 +1102,20 @@
+@@ -1107,18 +1105,20 @@
        tw_initconnect = (TW_Initconnect 
*)&full_command_packet->command.oldcommand;
        tw_initconnect->opcode__reserved = TW_OPRES_IN(0, 
TW_OP_INIT_CONNECTION);
        tw_initconnect->request_id = request_id;
@@ -313,7 +342,7 @@
        } else 
                tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE;
  
-@@ -1130,11 +1127,11 @@
+@@ -1130,11 +1130,11 @@
                TW_PRINTK(tw_dev->host, TW_DRIVER, 0x15, "No valid response 
during init connection");
        } else {
                if (set_features & TW_EXTENDED_INIT_CONNECT) {
@@ -330,16 +359,15 @@
                }
                retval = 0;
        }
-@@ -1193,7 +1190,7 @@
- } /* End twa_initialize_device_extension() */
- 
- /* This function is the interrupt service routine */
--static irqreturn_t twa_interrupt(int irq, void *dev_instance, struct pt_regs 
*regs)
-+static irqreturn_t twa_interrupt(int irq, void *dev_instance)
- {
-       int request_id, error = 0;
+@@ -1199,7 +1199,6 @@
        u32 status_reg_value;
-@@ -1215,6 +1212,10 @@
+       TW_Response_Queue response_que;
+       TW_Command_Full *full_command_packet;
+-      TW_Command *command_packet;
+       TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance;
+       int handled = 0;
+ 
+@@ -1215,6 +1214,10 @@
  
        handled = 1;
  
@@ -350,7 +378,28 @@
        /* Check controller for errors */
        if (twa_check_bits(status_reg_value)) {
                if (twa_decode_bits(tw_dev, status_reg_value)) {
-@@ -1356,12 +1357,12 @@
+@@ -1273,7 +1276,6 @@
+                       request_id = TW_RESID_OUT(response_que.response_id);
+                       full_command_packet = 
tw_dev->command_packet_virt[request_id];
+                       error = 0;
+-                      command_packet = 
&full_command_packet->command.oldcommand;
+                       /* Check for command packet errors */
+                       if (full_command_packet->command.newcommand.status != 
0) {
+                               if (tw_dev->srb[request_id] != 0) {
+@@ -1348,32 +1350,38 @@
+ } /* End twa_interrupt() */
+ 
+ /* This function will load the request id and various sgls for ioctls */
+-static void twa_load_sgl(TW_Command_Full *full_command_packet, int 
request_id, dma_addr_t dma_handle, int length)
++static void twa_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full 
*full_command_packet, int request_id, dma_addr_t dma_handle, int length)
+ {
+       TW_Command *oldcommand;
+       TW_Command_Apache *newcommand;
+       TW_SG_Entry *sgl;
++      unsigned int pae = 0;
++
++      if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4))
++              pae = 1;
  
        if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) 
== TW_OP_EXECUTE_SCSI) {
                newcommand = &full_command_packet->command.newcommand;
@@ -368,33 +417,33 @@
        } else {
                oldcommand = &full_command_packet->command.oldcommand;
                oldcommand->request_id = request_id;
-@@ -1369,8 +1370,8 @@
+ 
                if (TW_SGL_OUT(oldcommand->opcode__sgloffset)) {
                        /* Load the sg list */
-                       sgl = (TW_SG_Entry *)((u32 
*)oldcommand+TW_SGL_OUT(oldcommand->opcode__sgloffset));
+-                      sgl = (TW_SG_Entry *)((u32 
*)oldcommand+TW_SGL_OUT(oldcommand->opcode__sgloffset));
 -                      sgl->address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) 
- 1;
 -                      sgl->length = length;
++                      if (tw_dev->tw_pci_dev->device == 
PCI_DEVICE_ID_3WARE_9690SA)
++                              sgl = (TW_SG_Entry *)((u32 
*)oldcommand+oldcommand->size - (sizeof(TW_SG_Entry)/4) + pae);
++                      else
++                              sgl = (TW_SG_Entry *)((u32 
*)oldcommand+TW_SGL_OUT(oldcommand->opcode__sgloffset));
 +                      sgl->address = TW_CPU_TO_SGL(dma_handle + 
sizeof(TW_Ioctl_Buf_Apache) - 1);
 +                      sgl->length = cpu_to_le32(length);
  
-                       if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4))
-                               oldcommand->size += 1;
-@@ -1389,7 +1390,7 @@
-       if (cmd->use_sg == 0)
-               goto out;
- 
--      use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, DMA_BIDIRECTIONAL);
-+      use_sg = pci_map_sg(pdev, cmd->request_buffer, cmd->use_sg, 
DMA_BIDIRECTIONAL);
- 
-       if (use_sg == 0) {
-               TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter 
gather list");
-@@ -1532,6 +1533,13 @@
+-                      if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4))
+-                              oldcommand->size += 1;
++                      oldcommand->size += pae;
+               }
+       }
+ } /* End twa_load_sgl() */
+@@ -1532,6 +1540,14 @@
        int retval = 1;
  
        command_que_value = tw_dev->command_packet_phys[request_id];
 +
 +      /* For 9650SE write low 4 bytes first */
-+      if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) {
++      if ((tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) ||
++          (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9690SA)) {
 +              command_que_value += TW_COMMAND_OFFSET;
 +              writel((u32)command_que_value, 
TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev));
 +      }
@@ -402,7 +451,7 @@
        status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
  
        if (twa_check_bits(status_reg_value))
-@@ -1558,13 +1566,17 @@
+@@ -1558,13 +1574,18 @@
                TW_UNMASK_COMMAND_INTERRUPT(tw_dev);
                goto out;
        } else {
@@ -411,7 +460,8 @@
 -                      command_que_value += TW_COMMAND_OFFSET;
 -                      writel((u32)command_que_value, 
TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
 -                      writel((u32)((u64)command_que_value >> 32), 
TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4);
-+              if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) {
++              if ((tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) 
||
++                  (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9690SA)) 
{
 +                      /* Now write upper 4 bytes */
 +                      writel((u32)((u64)command_que_value >> 32), 
TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev) + 0x4);
                } else {
@@ -426,7 +476,16 @@
                }
                tw_dev->state[request_id] = TW_S_POSTED;
                tw_dev->posted_request_count++;
-@@ -1621,14 +1633,9 @@
+@@ -1578,7 +1599,7 @@
+ } /* End twa_post_command_packet() */
+ 
+ /* This function will reset a device extension */
+-static int twa_reset_device_extension(TW_Device_Extension *tw_dev, int 
ioctl_reset)
++static int twa_reset_device_extension(TW_Device_Extension *tw_dev)
+ {
+       int i = 0;
+       int retval = 1;
+@@ -1621,14 +1642,9 @@
                goto out;
  
        TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
@@ -443,7 +502,7 @@
        retval = 0;
  out:
        return retval;
-@@ -1737,6 +1744,9 @@
+@@ -1737,14 +1753,18 @@
                "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting 
card.\n",
                TW_DRIVER, 0x2c, SCpnt->cmnd[0]);
  
@@ -451,9 +510,11 @@
 +      mutex_lock(&tw_dev->ioctl_lock);
 +
        /* Now reset the card and some of the device extension data */
-       if (twa_reset_device_extension(tw_dev, 0)) {
+-      if (twa_reset_device_extension(tw_dev, 0)) {
++      if (twa_reset_device_extension(tw_dev)) {
                TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset 
failed during scsi host reset");
-@@ -1745,6 +1755,7 @@
+               goto out;
+       }
  
        retval = SUCCESS;
  out:
@@ -461,7 +522,7 @@
        return retval;
  } /* End twa_scsi_eh_reset() */
  
-@@ -1754,8 +1765,14 @@
+@@ -1754,8 +1774,14 @@
        int request_id, retval;
        TW_Device_Extension *tw_dev = (TW_Device_Extension 
*)SCpnt->device->host->hostdata;
  
@@ -477,7 +538,7 @@
                SCpnt->result = (DID_BAD_TARGET << 16);
                done(SCpnt);
                retval = 0;
-@@ -1828,10 +1845,10 @@
+@@ -1828,10 +1854,10 @@
        if (srb) {
                command_packet->unit = srb->device->id;
                command_packet->request_id__lunl =
@@ -490,7 +551,7 @@
                command_packet->unit = 0;
        }
  
-@@ -1841,8 +1858,8 @@
+@@ -1841,8 +1867,8 @@
                /* Map sglist from scsi layer to cmd packet */
                if (tw_dev->srb[request_id]->use_sg == 0) {
                        if (tw_dev->srb[request_id]->request_bufflen < 
TW_MIN_SGL_LENGTH) {
@@ -501,7 +562,7 @@
                                if (tw_dev->srb[request_id]->sc_data_direction 
== DMA_TO_DEVICE || tw_dev->srb[request_id]->sc_data_direction == 
DMA_BIDIRECTIONAL)
                                        
memcpy(tw_dev->generic_buffer_virt[request_id], 
tw_dev->srb[request_id]->request_buffer, 
tw_dev->srb[request_id]->request_bufflen);
                        } else {
-@@ -1850,12 +1867,12 @@
+@@ -1850,12 +1876,12 @@
                                if (buffaddr == 0)
                                        goto out;
  
@@ -518,7 +579,7 @@
                                TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2d, "Found 
unaligned address during execute scsi");
                                goto out;
                        }
-@@ -1869,35 +1886,35 @@
+@@ -1869,35 +1895,35 @@
                                        
memcpy(tw_dev->generic_buffer_virt[request_id], buf, sg->length);
                                        kunmap_atomic(buf - sg->offset, 
KM_IRQ0);
                                }
@@ -564,7 +625,7 @@
        }
  
        if (srb) {
-@@ -1961,6 +1978,9 @@
+@@ -1961,6 +1987,9 @@
        /* Disable interrupts */
        TW_DISABLE_INTERRUPTS(tw_dev);
  
@@ -574,7 +635,27 @@
        printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", 
tw_dev->host->host_no);
  
        /* Tell the card we are shutting down */
-@@ -2092,21 +2112,25 @@
+@@ -2043,11 +2072,14 @@
+ 
+       pci_set_master(pdev);
+ 
+-      retval = pci_set_dma_mask(pdev, sizeof(dma_addr_t) > 4 ? DMA_64BIT_MASK 
: DMA_32BIT_MASK);
+-      if (retval) {
+-              TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask");
+-              goto out_disable_device;
+-      }
++      if (pci_set_dma_mask(pdev, DMA_64BIT_MASK)
++          || pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))
++              if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)
++                  || pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) {
++                      TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma 
mask");
++                      retval = -ENODEV;
++                      goto out_disable_device;
++              }
+ 
+       host = scsi_host_alloc(&driver_template, sizeof(TW_Device_Extension));
+       if (!host) {
+@@ -2092,21 +2124,26 @@
  
        /* Initialize the card */
        if (twa_reset_sequence(tw_dev, 0))
@@ -583,7 +664,8 @@
  
        /* Set host specific parameters */
 -      host->max_id = TW_MAX_UNITS;
-+      if (pdev->device == PCI_DEVICE_ID_3WARE_9650SE)
++      if ((pdev->device == PCI_DEVICE_ID_3WARE_9650SE) ||
++          (pdev->device == PCI_DEVICE_ID_3WARE_9690SA))
 +              host->max_id = TW_MAX_UNITS_9650SE;
 +      else
 +              host->max_id = TW_MAX_UNITS;
@@ -604,7 +686,7 @@
        }
  
        pci_set_drvdata(pdev, host);
-@@ -2119,8 +2143,8 @@
+@@ -2119,8 +2156,8 @@
                                     TW_PARAM_FWVER, TW_PARAM_FWVER_LENGTH),
               (char *)twa_get_param(tw_dev, 1, TW_VERSION_TABLE,
                                     TW_PARAM_BIOSVER, TW_PARAM_BIOSVER_LENGTH),
@@ -615,7 +697,7 @@
  
        /* Now setup the interrupt handler */
        retval = request_irq(pdev->irq, twa_interrupt, SA_SHIRQ, "3w-9xxx", 
tw_dev);
-@@ -2146,6 +2170,8 @@
+@@ -2146,6 +2183,8 @@
  
  out_remove_host:
        scsi_remove_host(host);
@@ -624,7 +706,7 @@
  out_release_mem_region:
        pci_release_regions(pdev);
  out_free_device_extension:
-@@ -2171,12 +2197,12 @@
+@@ -2171,12 +2210,12 @@
                twa_major = -1;
        }
  
@@ -640,27 +722,20 @@
        /* Free up the mem region */
        pci_release_regions(pdev);
  
-@@ -2194,6 +2220,8 @@
+@@ -2194,6 +2233,10 @@
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 +      { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9650SE,
 +        PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
++      { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9690SA,
++        PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
        { }
  };
  MODULE_DEVICE_TABLE(pci, twa_pci_tbl);
-@@ -2212,7 +2240,7 @@
- {
-       printk(KERN_WARNING "3ware 9000 Storage Controller device driver for 
Linux v%s.\n", TW_DRIVER_VERSION);
- 
--      return pci_module_init(&twa_driver);
-+      return pci_register_driver(&twa_driver);
- } /* End twa_init() */
- 
- /* This function is called on driver exit */
 diff -uNr linux-2.6.16.orig/drivers/scsi/3w-9xxx.h 
linux-2.6.16/drivers/scsi/3w-9xxx.h
---- linux-2.6.16.orig/drivers/scsi/3w-9xxx.h   2006-03-20 06:53:29.000000000 
+0100
-+++ linux-2.6.16/drivers/scsi/3w-9xxx.h        2006-10-20 22:22:02.000000000 
+0200
+--- linux-2.6.16.orig/drivers/scsi/3w-9xxx.h   2006-03-20 05:53:29.000000000 
+0000
++++ linux-2.6.16/drivers/scsi/3w-9xxx.h        2008-04-06 09:36:47.000000000 
+0000
 @@ -2,8 +2,9 @@
     3w-9xxx.h -- 3ware 9000 Storage Controller device driver for Linux.
  
@@ -668,7 +743,7 @@
 +   Modifications By: Tom Couch <[EMAIL PROTECTED]>
  
 -   Copyright (C) 2004-2005 Applied Micro Circuits Corporation.
-+   Copyright (C) 2004-2006 Applied Micro Circuits Corporation.
++   Copyright (C) 2004-2007 Applied Micro Circuits Corporation.
  
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -700,17 +775,20 @@
  #define TW_IN_ATTENTION_LOOP                4
  #define TW_MAX_SECTORS                        256
  #define TW_AEN_WAIT_TIME                      1000
-@@ -419,6 +416,9 @@
+@@ -419,6 +416,12 @@
  #ifndef PCI_DEVICE_ID_3WARE_9550SX
  #define PCI_DEVICE_ID_3WARE_9550SX 0x1003
  #endif
 +#ifndef PCI_DEVICE_ID_3WARE_9650SE
 +#define PCI_DEVICE_ID_3WARE_9650SE 0x1004
 +#endif
++#ifndef PCI_DEVICE_ID_3WARE_9690SA
++#define PCI_DEVICE_ID_3WARE_9690SA 0x1005
++#endif
  
  /* Bitmask macros to eliminate bitfields */
  
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/linux-3w-9xxx.patch?r1=1.1&r2=1.1.2.1&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to