[PATCH] x86_64: Fix up outdated pfn_to_page comment
[linux-2.6] / drivers / scsi / 3w-9xxx.c
1 /*
2    3w-9xxx.c -- 3ware 9000 Storage Controller device driver for Linux.
3
4    Written By: Adam Radford <linuxraid@amcc.com>
5
6    Copyright (C) 2004-2005 Applied Micro Circuits Corporation.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; version 2 of the License.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    NO WARRANTY
18    THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
19    CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
20    LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
21    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
22    solely responsible for determining the appropriateness of using and
23    distributing the Program and assumes all risks associated with its
24    exercise of rights under this Agreement, including but not limited to
25    the risks and costs of program errors, damage to or loss of data,
26    programs or equipment, and unavailability or interruption of operations.
27
28    DISCLAIMER OF LIABILITY
29    NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
30    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31    DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
32    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
33    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
34    USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
35    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
36
37    You should have received a copy of the GNU General Public License
38    along with this program; if not, write to the Free Software
39    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
40
41    Bugs/Comments/Suggestions should be mailed to:
42    linuxraid@amcc.com
43
44    For more information, goto:
45    http://www.amcc.com
46
47    Note: This version of the driver does not contain a bundled firmware
48          image.
49
50    History
51    -------
52    2.26.02.000 - Driver cleanup for kernel submission.
53    2.26.02.001 - Replace schedule_timeout() calls with msleep().
54    2.26.02.002 - Add support for PAE mode.
55                  Add lun support.
56                  Fix twa_remove() to free irq handler/unregister_chrdev()
57                  before shutting down card.
58                  Change to new 'change_queue_depth' api.
59                  Fix 'handled=1' ISR usage, remove bogus IRQ check.
60                  Remove un-needed eh_abort handler.
61                  Add support for embedded firmware error strings.
62    2.26.02.003 - Correctly handle single sgl's with use_sg=1.
63    2.26.02.004 - Add support for 9550SX controllers.
64 */
65
66 #include <linux/module.h>
67 #include <linux/reboot.h>
68 #include <linux/spinlock.h>
69 #include <linux/interrupt.h>
70 #include <linux/moduleparam.h>
71 #include <linux/errno.h>
72 #include <linux/types.h>
73 #include <linux/delay.h>
74 #include <linux/pci.h>
75 #include <linux/time.h>
76 #include <asm/io.h>
77 #include <asm/irq.h>
78 #include <asm/uaccess.h>
79 #include <scsi/scsi.h>
80 #include <scsi/scsi_host.h>
81 #include <scsi/scsi_tcq.h>
82 #include <scsi/scsi_cmnd.h>
83 #include "3w-9xxx.h"
84
85 /* Globals */
86 #define TW_DRIVER_VERSION "2.26.02.004"
87 static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT];
88 static unsigned int twa_device_extension_count;
89 static int twa_major = -1;
90 extern struct timezone sys_tz;
91
92 /* Module parameters */
93 MODULE_AUTHOR ("AMCC");
94 MODULE_DESCRIPTION ("3ware 9000 Storage Controller Linux Driver");
95 MODULE_LICENSE("GPL");
96 MODULE_VERSION(TW_DRIVER_VERSION);
97
98 /* Function prototypes */
99 static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header);
100 static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id);
101 static char *twa_aen_severity_lookup(unsigned char severity_code);
102 static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id);
103 static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
104 static int twa_chrdev_open(struct inode *inode, struct file *file);
105 static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host);
106 static void twa_free_request_id(TW_Device_Extension *tw_dev,int request_id);
107 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id);
108 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
109                               u32 set_features, unsigned short current_fw_srl, 
110                               unsigned short current_fw_arch_id, 
111                               unsigned short current_fw_branch, 
112                               unsigned short current_fw_build, 
113                               unsigned short *fw_on_ctlr_srl, 
114                               unsigned short *fw_on_ctlr_arch_id, 
115                               unsigned short *fw_on_ctlr_branch, 
116                               unsigned short *fw_on_ctlr_build, 
117                               u32 *init_connect_result);
118 static void twa_load_sgl(TW_Command_Full *full_command_packet, int request_id, dma_addr_t dma_handle, int length);
119 static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds);
120 static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int seconds);
121 static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, char internal);
122 static int twa_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_reset);
123 static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset);
124 static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg);
125 static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id);
126 static char *twa_string_lookup(twa_message_type *table, unsigned int aen_code);
127 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id);
128
129 /* Functions */
130
131 /* Show some statistics about the card */
132 static ssize_t twa_show_stats(struct class_device *class_dev, char *buf)
133 {
134         struct Scsi_Host *host = class_to_shost(class_dev);
135         TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
136         unsigned long flags = 0;
137         ssize_t len;
138
139         spin_lock_irqsave(tw_dev->host->host_lock, flags);
140         len = snprintf(buf, PAGE_SIZE, "3w-9xxx Driver version: %s\n"
141                        "Current commands posted:   %4d\n"
142                        "Max commands posted:       %4d\n"
143                        "Current pending commands:  %4d\n"
144                        "Max pending commands:      %4d\n"
145                        "Last sgl length:           %4d\n"
146                        "Max sgl length:            %4d\n"
147                        "Last sector count:         %4d\n"
148                        "Max sector count:          %4d\n"
149                        "SCSI Host Resets:          %4d\n"
150                        "AEN's:                     %4d\n", 
151                        TW_DRIVER_VERSION,
152                        tw_dev->posted_request_count,
153                        tw_dev->max_posted_request_count,
154                        tw_dev->pending_request_count,
155                        tw_dev->max_pending_request_count,
156                        tw_dev->sgl_entries,
157                        tw_dev->max_sgl_entries,
158                        tw_dev->sector_count,
159                        tw_dev->max_sector_count,
160                        tw_dev->num_resets,
161                        tw_dev->aen_count);
162         spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
163         return len;
164 } /* End twa_show_stats() */
165
166 /* This function will set a devices queue depth */
167 static int twa_change_queue_depth(struct scsi_device *sdev, int queue_depth)
168 {
169         if (queue_depth > TW_Q_LENGTH-2)
170                 queue_depth = TW_Q_LENGTH-2;
171         scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, queue_depth);
172         return queue_depth;
173 } /* End twa_change_queue_depth() */
174
175 /* Create sysfs 'stats' entry */
176 static struct class_device_attribute twa_host_stats_attr = {
177         .attr = {
178                 .name =         "stats",
179                 .mode =         S_IRUGO,
180         },
181         .show = twa_show_stats
182 };
183
184 /* Host attributes initializer */
185 static struct class_device_attribute *twa_host_attrs[] = {
186         &twa_host_stats_attr,
187         NULL,
188 };
189
190 /* File operations struct for character device */
191 static struct file_operations twa_fops = {
192         .owner          = THIS_MODULE,
193         .ioctl          = twa_chrdev_ioctl,
194         .open           = twa_chrdev_open,
195         .release        = NULL
196 };
197
198 /* This function will complete an aen request from the isr */
199 static int twa_aen_complete(TW_Device_Extension *tw_dev, int request_id)
200 {
201         TW_Command_Full *full_command_packet;
202         TW_Command *command_packet;
203         TW_Command_Apache_Header *header;
204         unsigned short aen;
205         int retval = 1;
206
207         header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
208         tw_dev->posted_request_count--;
209         aen = header->status_block.error;
210         full_command_packet = tw_dev->command_packet_virt[request_id];
211         command_packet = &full_command_packet->command.oldcommand;
212
213         /* First check for internal completion of set param for time sync */
214         if (TW_OP_OUT(command_packet->opcode__sgloffset) == TW_OP_SET_PARAM) {
215                 /* Keep reading the queue in case there are more aen's */
216                 if (twa_aen_read_queue(tw_dev, request_id))
217                         goto out2;
218                 else {
219                         retval = 0;
220                         goto out;
221                 }
222         }
223
224         switch (aen) {
225         case TW_AEN_QUEUE_EMPTY:
226                 /* Quit reading the queue if this is the last one */
227                 break;
228         case TW_AEN_SYNC_TIME_WITH_HOST:
229                 twa_aen_sync_time(tw_dev, request_id);
230                 retval = 0;
231                 goto out;
232         default:
233                 twa_aen_queue_event(tw_dev, header);
234
235                 /* If there are more aen's, keep reading the queue */
236                 if (twa_aen_read_queue(tw_dev, request_id))
237                         goto out2;
238                 else {
239                         retval = 0;
240                         goto out;
241                 }
242         }
243         retval = 0;
244 out2:
245         tw_dev->state[request_id] = TW_S_COMPLETED;
246         twa_free_request_id(tw_dev, request_id);
247         clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
248 out:
249         return retval;
250 } /* End twa_aen_complete() */
251
252 /* This function will drain aen queue */
253 static int twa_aen_drain_queue(TW_Device_Extension *tw_dev, int no_check_reset)
254 {
255         int request_id = 0;
256         char cdb[TW_MAX_CDB_LEN];
257         TW_SG_Entry sglist[1];
258         int finished = 0, count = 0;
259         TW_Command_Full *full_command_packet;
260         TW_Command_Apache_Header *header;
261         unsigned short aen;
262         int first_reset = 0, queue = 0, retval = 1;
263
264         if (no_check_reset)
265                 first_reset = 0;
266         else
267                 first_reset = 1;
268
269         full_command_packet = tw_dev->command_packet_virt[request_id];
270         memset(full_command_packet, 0, sizeof(TW_Command_Full));
271
272         /* Initialize cdb */
273         memset(&cdb, 0, TW_MAX_CDB_LEN);
274         cdb[0] = REQUEST_SENSE; /* opcode */
275         cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
276
277         /* Initialize sglist */
278         memset(&sglist, 0, sizeof(TW_SG_Entry));
279         sglist[0].length = TW_SECTOR_SIZE;
280         sglist[0].address = tw_dev->generic_buffer_phys[request_id];
281
282         if (sglist[0].address & TW_ALIGNMENT_9000_SGL) {
283                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Found unaligned address during AEN drain");
284                 goto out;
285         }
286
287         /* Mark internal command */
288         tw_dev->srb[request_id] = NULL;
289
290         do {
291                 /* Send command to the board */
292                 if (twa_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
293                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2, "Error posting request sense");
294                         goto out;
295                 }
296
297                 /* Now poll for completion */
298                 if (twa_poll_response(tw_dev, request_id, 30)) {
299                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x3, "No valid response while draining AEN queue");
300                         tw_dev->posted_request_count--;
301                         goto out;
302                 }
303
304                 tw_dev->posted_request_count--;
305                 header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
306                 aen = header->status_block.error;
307                 queue = 0;
308                 count++;
309
310                 switch (aen) {
311                 case TW_AEN_QUEUE_EMPTY:
312                         if (first_reset != 1)
313                                 goto out;
314                         else
315                                 finished = 1;
316                         break;
317                 case TW_AEN_SOFT_RESET:
318                         if (first_reset == 0)
319                                 first_reset = 1;
320                         else
321                                 queue = 1;
322                         break;
323                 case TW_AEN_SYNC_TIME_WITH_HOST:
324                         break;
325                 default:
326                         queue = 1;
327                 }
328
329                 /* Now queue an event info */
330                 if (queue)
331                         twa_aen_queue_event(tw_dev, header);
332         } while ((finished == 0) && (count < TW_MAX_AEN_DRAIN));
333
334         if (count == TW_MAX_AEN_DRAIN)
335                 goto out;
336
337         retval = 0;
338 out:
339         tw_dev->state[request_id] = TW_S_INITIAL;
340         return retval;
341 } /* End twa_aen_drain_queue() */
342
343 /* This function will queue an event */
344 static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header)
345 {
346         u32 local_time;
347         struct timeval time;
348         TW_Event *event;
349         unsigned short aen;
350         char host[16];
351         char *error_str;
352
353         tw_dev->aen_count++;
354
355         /* Fill out event info */
356         event = tw_dev->event_queue[tw_dev->error_index];
357
358         /* Check for clobber */
359         host[0] = '\0';
360         if (tw_dev->host) {
361                 sprintf(host, " scsi%d:", tw_dev->host->host_no);
362                 if (event->retrieved == TW_AEN_NOT_RETRIEVED)
363                         tw_dev->aen_clobber = 1;
364         }
365
366         aen = header->status_block.error;
367         memset(event, 0, sizeof(TW_Event));
368
369         event->severity = TW_SEV_OUT(header->status_block.severity__reserved);
370         do_gettimeofday(&time);
371         local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60));
372         event->time_stamp_sec = local_time;
373         event->aen_code = aen;
374         event->retrieved = TW_AEN_NOT_RETRIEVED;
375         event->sequence_id = tw_dev->error_sequence_id;
376         tw_dev->error_sequence_id++;
377
378         /* Check for embedded error string */
379         error_str = &(header->err_specific_desc[strlen(header->err_specific_desc)+1]);
380
381         header->err_specific_desc[sizeof(header->err_specific_desc) - 1] = '\0';
382         event->parameter_len = strlen(header->err_specific_desc);
383         memcpy(event->parameter_data, header->err_specific_desc, event->parameter_len);
384         if (event->severity != TW_AEN_SEVERITY_DEBUG)
385                 printk(KERN_WARNING "3w-9xxx:%s AEN: %s (0x%02X:0x%04X): %s:%s.\n",
386                        host,
387                        twa_aen_severity_lookup(TW_SEV_OUT(header->status_block.severity__reserved)),
388                        TW_MESSAGE_SOURCE_CONTROLLER_EVENT, aen,
389                        error_str[0] == '\0' ? twa_string_lookup(twa_aen_table, aen) : error_str,
390                        header->err_specific_desc);
391         else
392                 tw_dev->aen_count--;
393
394         if ((tw_dev->error_index + 1) == TW_Q_LENGTH)
395                 tw_dev->event_queue_wrapped = 1;
396         tw_dev->error_index = (tw_dev->error_index + 1 ) % TW_Q_LENGTH;
397 } /* End twa_aen_queue_event() */
398
399 /* This function will read the aen queue from the isr */
400 static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id)
401 {
402         char cdb[TW_MAX_CDB_LEN];
403         TW_SG_Entry sglist[1];
404         TW_Command_Full *full_command_packet;
405         int retval = 1;
406
407         full_command_packet = tw_dev->command_packet_virt[request_id];
408         memset(full_command_packet, 0, sizeof(TW_Command_Full));
409
410         /* Initialize cdb */
411         memset(&cdb, 0, TW_MAX_CDB_LEN);
412         cdb[0] = REQUEST_SENSE; /* opcode */
413         cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
414
415         /* Initialize sglist */
416         memset(&sglist, 0, sizeof(TW_SG_Entry));
417         sglist[0].length = TW_SECTOR_SIZE;
418         sglist[0].address = tw_dev->generic_buffer_phys[request_id];
419
420         /* Mark internal command */
421         tw_dev->srb[request_id] = NULL;
422
423         /* Now post the command packet */
424         if (twa_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
425                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x4, "Post failed while reading AEN queue");
426                 goto out;
427         }
428         retval = 0;
429 out:
430         return retval;
431 } /* End twa_aen_read_queue() */
432
433 /* This function will look up an AEN severity string */
434 static char *twa_aen_severity_lookup(unsigned char severity_code)
435 {
436         char *retval = NULL;
437
438         if ((severity_code < (unsigned char) TW_AEN_SEVERITY_ERROR) ||
439             (severity_code > (unsigned char) TW_AEN_SEVERITY_DEBUG))
440                 goto out;
441
442         retval = twa_aen_severity_table[severity_code];
443 out:
444         return retval;
445 } /* End twa_aen_severity_lookup() */
446
447 /* This function will sync firmware time with the host time */
448 static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id)
449 {
450         u32 schedulertime;
451         struct timeval utc;
452         TW_Command_Full *full_command_packet;
453         TW_Command *command_packet;
454         TW_Param_Apache *param;
455         u32 local_time;
456
457         /* Fill out the command packet */
458         full_command_packet = tw_dev->command_packet_virt[request_id];
459         memset(full_command_packet, 0, sizeof(TW_Command_Full));
460         command_packet = &full_command_packet->command.oldcommand;
461         command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_SET_PARAM);
462         command_packet->request_id = request_id;
463         command_packet->byte8_offset.param.sgl[0].address = tw_dev->generic_buffer_phys[request_id];
464         command_packet->byte8_offset.param.sgl[0].length = TW_SECTOR_SIZE;
465         command_packet->size = TW_COMMAND_SIZE;
466         command_packet->byte6_offset.parameter_count = 1;
467
468         /* Setup the param */
469         param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
470         memset(param, 0, TW_SECTOR_SIZE);
471         param->table_id = TW_TIMEKEEP_TABLE | 0x8000; /* Controller time keep table */
472         param->parameter_id = 0x3; /* SchedulerTime */
473         param->parameter_size_bytes = 4;
474
475         /* Convert system time in UTC to local time seconds since last 
476            Sunday 12:00AM */
477         do_gettimeofday(&utc);
478         local_time = (u32)(utc.tv_sec - (sys_tz.tz_minuteswest * 60));
479         schedulertime = local_time - (3 * 86400);
480         schedulertime = schedulertime % 604800;
481
482         memcpy(param->data, &schedulertime, sizeof(u32));
483
484         /* Mark internal command */
485         tw_dev->srb[request_id] = NULL;
486
487         /* Now post the command */
488         twa_post_command_packet(tw_dev, request_id, 1);
489 } /* End twa_aen_sync_time() */
490
491 /* This function will allocate memory and check if it is correctly aligned */
492 static int twa_allocate_memory(TW_Device_Extension *tw_dev, int size, int which)
493 {
494         int i;
495         dma_addr_t dma_handle;
496         unsigned long *cpu_addr;
497         int retval = 1;
498
499         cpu_addr = pci_alloc_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, &dma_handle);
500         if (!cpu_addr) {
501                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x5, "Memory allocation failed");
502                 goto out;
503         }
504
505         if ((unsigned long)cpu_addr % (TW_ALIGNMENT_9000)) {
506                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x6, "Failed to allocate correctly aligned memory");
507                 pci_free_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, cpu_addr, dma_handle);
508                 goto out;
509         }
510
511         memset(cpu_addr, 0, size*TW_Q_LENGTH);
512
513         for (i = 0; i < TW_Q_LENGTH; i++) {
514                 switch(which) {
515                 case 0:
516                         tw_dev->command_packet_phys[i] = dma_handle+(i*size);
517                         tw_dev->command_packet_virt[i] = (TW_Command_Full *)((unsigned char *)cpu_addr + (i*size));
518                         break;
519                 case 1:
520                         tw_dev->generic_buffer_phys[i] = dma_handle+(i*size);
521                         tw_dev->generic_buffer_virt[i] = (unsigned long *)((unsigned char *)cpu_addr + (i*size));
522                         break;
523                 }
524         }
525         retval = 0;
526 out:
527         return retval;
528 } /* End twa_allocate_memory() */
529
530 /* This function will check the status register for unexpected bits */
531 static int twa_check_bits(u32 status_reg_value)
532 {
533         int retval = 1;
534
535         if ((status_reg_value & TW_STATUS_EXPECTED_BITS) != TW_STATUS_EXPECTED_BITS)
536                 goto out;
537         if ((status_reg_value & TW_STATUS_UNEXPECTED_BITS) != 0)
538                 goto out;
539
540         retval = 0;
541 out:
542         return retval;
543 } /* End twa_check_bits() */
544
545 /* This function will check the srl and decide if we are compatible  */
546 static int twa_check_srl(TW_Device_Extension *tw_dev, int *flashed)
547 {
548         int retval = 1;
549         unsigned short fw_on_ctlr_srl = 0, fw_on_ctlr_arch_id = 0;
550         unsigned short fw_on_ctlr_branch = 0, fw_on_ctlr_build = 0;
551         u32 init_connect_result = 0;
552
553         if (twa_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
554                                TW_EXTENDED_INIT_CONNECT, TW_CURRENT_DRIVER_SRL,
555                                TW_9000_ARCH_ID, TW_CURRENT_DRIVER_BRANCH,
556                                TW_CURRENT_DRIVER_BUILD, &fw_on_ctlr_srl,
557                                &fw_on_ctlr_arch_id, &fw_on_ctlr_branch,
558                                &fw_on_ctlr_build, &init_connect_result)) {
559                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x7, "Initconnection failed while checking SRL");
560                 goto out;
561         }
562
563         tw_dev->working_srl = fw_on_ctlr_srl;
564         tw_dev->working_branch = fw_on_ctlr_branch;
565         tw_dev->working_build = fw_on_ctlr_build;
566
567         /* Try base mode compatibility */
568         if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
569                 if (twa_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
570                                        TW_EXTENDED_INIT_CONNECT,
571                                        TW_BASE_FW_SRL, TW_9000_ARCH_ID,
572                                        TW_BASE_FW_BRANCH, TW_BASE_FW_BUILD,
573                                        &fw_on_ctlr_srl, &fw_on_ctlr_arch_id,
574                                        &fw_on_ctlr_branch, &fw_on_ctlr_build,
575                                        &init_connect_result)) {
576                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0xa, "Initconnection (base mode) failed while checking SRL");
577                         goto out;
578                 }
579                 if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
580                         if (TW_CURRENT_DRIVER_SRL > fw_on_ctlr_srl) {
581                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x32, "Firmware and driver incompatibility: please upgrade firmware");
582                         } else {
583                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x33, "Firmware and driver incompatibility: please upgrade driver");
584                         }
585                         goto out;
586                 }
587                 tw_dev->working_srl = TW_BASE_FW_SRL;
588                 tw_dev->working_branch = TW_BASE_FW_BRANCH;
589                 tw_dev->working_build = TW_BASE_FW_BUILD;
590         }
591         retval = 0;
592 out:
593         return retval;
594 } /* End twa_check_srl() */
595
596 /* This function handles ioctl for the character device */
597 static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
598 {
599         long timeout;
600         unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0;
601         dma_addr_t dma_handle;
602         int request_id = 0;
603         unsigned int sequence_id = 0;
604         unsigned char event_index, start_index;
605         TW_Ioctl_Driver_Command driver_command;
606         TW_Ioctl_Buf_Apache *tw_ioctl;
607         TW_Lock *tw_lock;
608         TW_Command_Full *full_command_packet;
609         TW_Compatibility_Info *tw_compat_info;
610         TW_Event *event;
611         struct timeval current_time;
612         u32 current_time_ms;
613         TW_Device_Extension *tw_dev = twa_device_extension_list[iminor(inode)];
614         int retval = TW_IOCTL_ERROR_OS_EFAULT;
615         void __user *argp = (void __user *)arg;
616
617         /* Only let one of these through at a time */
618         if (down_interruptible(&tw_dev->ioctl_sem)) {
619                 retval = TW_IOCTL_ERROR_OS_EINTR;
620                 goto out;
621         }
622
623         /* First copy down the driver command */
624         if (copy_from_user(&driver_command, argp, sizeof(TW_Ioctl_Driver_Command)))
625                 goto out2;
626
627         /* Check data buffer size */
628         if (driver_command.buffer_length > TW_MAX_SECTORS * 512) {
629                 retval = TW_IOCTL_ERROR_OS_EINVAL;
630                 goto out2;
631         }
632
633         /* Hardware can only do multiple of 512 byte transfers */
634         data_buffer_length_adjusted = (driver_command.buffer_length + 511) & ~511;
635
636         /* Now allocate ioctl buf memory */
637         cpu_addr = dma_alloc_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, &dma_handle, GFP_KERNEL);
638         if (!cpu_addr) {
639                 retval = TW_IOCTL_ERROR_OS_ENOMEM;
640                 goto out2;
641         }
642
643         tw_ioctl = (TW_Ioctl_Buf_Apache *)cpu_addr;
644
645         /* Now copy down the entire ioctl */
646         if (copy_from_user(tw_ioctl, argp, driver_command.buffer_length + sizeof(TW_Ioctl_Buf_Apache) - 1))
647                 goto out3;
648
649         /* See which ioctl we are doing */
650         switch (cmd) {
651         case TW_IOCTL_FIRMWARE_PASS_THROUGH:
652                 spin_lock_irqsave(tw_dev->host->host_lock, flags);
653                 twa_get_request_id(tw_dev, &request_id);
654
655                 /* Flag internal command */
656                 tw_dev->srb[request_id] = NULL;
657
658                 /* Flag chrdev ioctl */
659                 tw_dev->chrdev_request_id = request_id;
660
661                 full_command_packet = &tw_ioctl->firmware_command;
662
663                 /* Load request id and sglist for both command types */
664                 twa_load_sgl(full_command_packet, request_id, dma_handle, data_buffer_length_adjusted);
665
666                 memcpy(tw_dev->command_packet_virt[request_id], &(tw_ioctl->firmware_command), sizeof(TW_Command_Full));
667
668                 /* Now post the command packet to the controller */
669                 twa_post_command_packet(tw_dev, request_id, 1);
670                 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
671
672                 timeout = TW_IOCTL_CHRDEV_TIMEOUT*HZ;
673
674                 /* Now wait for command to complete */
675                 timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout);
676
677                 /* See if we reset while waiting for the ioctl to complete */
678                 if (test_bit(TW_IN_RESET, &tw_dev->flags)) {
679                         clear_bit(TW_IN_RESET, &tw_dev->flags);
680                         retval = TW_IOCTL_ERROR_OS_ERESTARTSYS;
681                         goto out3;
682                 }
683
684                 /* We timed out, and didn't get an interrupt */
685                 if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) {
686                         /* Now we need to reset the board */
687                         printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Character ioctl (0x%x) timed out, resetting card.\n",
688                                tw_dev->host->host_no, TW_DRIVER, 0xc,
689                                cmd);
690                         retval = TW_IOCTL_ERROR_OS_EIO;
691                         spin_lock_irqsave(tw_dev->host->host_lock, flags);
692                         tw_dev->state[request_id] = TW_S_COMPLETED;
693                         twa_free_request_id(tw_dev, request_id);
694                         tw_dev->posted_request_count--;
695                         spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
696                         twa_reset_device_extension(tw_dev, 1);
697                         goto out3;
698                 }
699
700                 /* Now copy in the command packet response */
701                 memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virt[request_id], sizeof(TW_Command_Full));
702                 
703                 /* Now complete the io */
704                 spin_lock_irqsave(tw_dev->host->host_lock, flags);
705                 tw_dev->posted_request_count--;
706                 tw_dev->state[request_id] = TW_S_COMPLETED;
707                 twa_free_request_id(tw_dev, request_id);
708                 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
709                 break;
710         case TW_IOCTL_GET_COMPATIBILITY_INFO:
711                 tw_ioctl->driver_command.status = 0;
712                 /* Copy compatiblity struct into ioctl data buffer */
713                 tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer;
714                 strncpy(tw_compat_info->driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION));
715                 tw_compat_info->working_srl = tw_dev->working_srl;
716                 tw_compat_info->working_branch = tw_dev->working_branch;
717                 tw_compat_info->working_build = tw_dev->working_build;
718                 tw_compat_info->driver_srl_high = TW_CURRENT_DRIVER_SRL;
719                 tw_compat_info->driver_branch_high = TW_CURRENT_DRIVER_BRANCH;
720                 tw_compat_info->driver_build_high = TW_CURRENT_DRIVER_BUILD;
721                 tw_compat_info->driver_srl_low = TW_BASE_FW_SRL;
722                 tw_compat_info->driver_branch_low = TW_BASE_FW_BRANCH;
723                 tw_compat_info->driver_build_low = TW_BASE_FW_BUILD;
724                 break;
725         case TW_IOCTL_GET_LAST_EVENT:
726                 if (tw_dev->event_queue_wrapped) {
727                         if (tw_dev->aen_clobber) {
728                                 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
729                                 tw_dev->aen_clobber = 0;
730                         } else
731                                 tw_ioctl->driver_command.status = 0;
732                 } else {
733                         if (!tw_dev->error_index) {
734                                 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
735                                 break;
736                         }
737                         tw_ioctl->driver_command.status = 0;
738                 }
739                 event_index = (tw_dev->error_index - 1 + TW_Q_LENGTH) % TW_Q_LENGTH;
740                 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
741                 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
742                 break;
743         case TW_IOCTL_GET_FIRST_EVENT:
744                 if (tw_dev->event_queue_wrapped) {
745                         if (tw_dev->aen_clobber) {
746                                 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
747                                 tw_dev->aen_clobber = 0;
748                         } else 
749                                 tw_ioctl->driver_command.status = 0;
750                         event_index = tw_dev->error_index;
751                 } else {
752                         if (!tw_dev->error_index) {
753                                 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
754                                 break;
755                         }
756                         tw_ioctl->driver_command.status = 0;
757                         event_index = 0;
758                 }
759                 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
760                 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
761                 break;
762         case TW_IOCTL_GET_NEXT_EVENT:
763                 event = (TW_Event *)tw_ioctl->data_buffer;
764                 sequence_id = event->sequence_id;
765                 tw_ioctl->driver_command.status = 0;
766
767                 if (tw_dev->event_queue_wrapped) {
768                         if (tw_dev->aen_clobber) {
769                                 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
770                                 tw_dev->aen_clobber = 0;
771                         }
772                         start_index = tw_dev->error_index;
773                 } else {
774                         if (!tw_dev->error_index) {
775                                 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
776                                 break;
777                         }
778                         start_index = 0;
779                 }
780                 event_index = (start_index + sequence_id - tw_dev->event_queue[start_index]->sequence_id + 1) % TW_Q_LENGTH;
781
782                 if (!(tw_dev->event_queue[event_index]->sequence_id > sequence_id)) {
783                         if (tw_ioctl->driver_command.status == TW_IOCTL_ERROR_STATUS_AEN_CLOBBER)
784                                 tw_dev->aen_clobber = 1;
785                         tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
786                         break;
787                 }
788                 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
789                 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
790                 break;
791         case TW_IOCTL_GET_PREVIOUS_EVENT:
792                 event = (TW_Event *)tw_ioctl->data_buffer;
793                 sequence_id = event->sequence_id;
794                 tw_ioctl->driver_command.status = 0;
795
796                 if (tw_dev->event_queue_wrapped) {
797                         if (tw_dev->aen_clobber) {
798                                 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
799                                 tw_dev->aen_clobber = 0;
800                         }
801                         start_index = tw_dev->error_index;
802                 } else {
803                         if (!tw_dev->error_index) {
804                                 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
805                                 break;
806                         }
807                         start_index = 0;
808                 }
809                 event_index = (start_index + sequence_id - tw_dev->event_queue[start_index]->sequence_id - 1) % TW_Q_LENGTH;
810
811                 if (!(tw_dev->event_queue[event_index]->sequence_id < sequence_id)) {
812                         if (tw_ioctl->driver_command.status == TW_IOCTL_ERROR_STATUS_AEN_CLOBBER)
813                                 tw_dev->aen_clobber = 1;
814                         tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
815                         break;
816                 }
817                 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
818                 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
819                 break;
820         case TW_IOCTL_GET_LOCK:
821                 tw_lock = (TW_Lock *)tw_ioctl->data_buffer;
822                 do_gettimeofday(&current_time);
823                 current_time_ms = (current_time.tv_sec * 1000) + (current_time.tv_usec / 1000);
824
825                 if ((tw_lock->force_flag == 1) || (tw_dev->ioctl_sem_lock == 0) || (current_time_ms >= tw_dev->ioctl_msec)) {
826                         tw_dev->ioctl_sem_lock = 1;
827                         tw_dev->ioctl_msec = current_time_ms + tw_lock->timeout_msec;
828                         tw_ioctl->driver_command.status = 0;
829                         tw_lock->time_remaining_msec = tw_lock->timeout_msec;
830                 } else {
831                         tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_LOCKED;
832                         tw_lock->time_remaining_msec = tw_dev->ioctl_msec - current_time_ms;
833                 }
834                 break;
835         case TW_IOCTL_RELEASE_LOCK:
836                 if (tw_dev->ioctl_sem_lock == 1) {
837                         tw_dev->ioctl_sem_lock = 0;
838                         tw_ioctl->driver_command.status = 0;
839                 } else {
840                         tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NOT_LOCKED;
841                 }
842                 break;
843         default:
844                 retval = TW_IOCTL_ERROR_OS_ENOTTY;
845                 goto out3;
846         }
847
848         /* Now copy the entire response to userspace */
849         if (copy_to_user(argp, tw_ioctl, sizeof(TW_Ioctl_Buf_Apache) + driver_command.buffer_length - 1) == 0)
850                 retval = 0;
851 out3:
852         /* Now free ioctl buf memory */
853         dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, cpu_addr, dma_handle);
854 out2:
855         up(&tw_dev->ioctl_sem);
856 out:
857         return retval;
858 } /* End twa_chrdev_ioctl() */
859
860 /* This function handles open for the character device */
861 static int twa_chrdev_open(struct inode *inode, struct file *file)
862 {
863         unsigned int minor_number;
864         int retval = TW_IOCTL_ERROR_OS_ENODEV;
865
866         minor_number = iminor(inode);
867         if (minor_number >= twa_device_extension_count)
868                 goto out;
869         retval = 0;
870 out:
871         return retval;
872 } /* End twa_chrdev_open() */
873
874 /* This function will print readable messages from status register errors */
875 static int twa_decode_bits(TW_Device_Extension *tw_dev, u32 status_reg_value)
876 {
877         int retval = 1;
878
879         /* Check for various error conditions and handle them appropriately */
880         if (status_reg_value & TW_STATUS_PCI_PARITY_ERROR) {
881                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xc, "PCI Parity Error: clearing");
882                 writel(TW_CONTROL_CLEAR_PARITY_ERROR, TW_CONTROL_REG_ADDR(tw_dev));
883         }
884
885         if (status_reg_value & TW_STATUS_PCI_ABORT) {
886                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xd, "PCI Abort: clearing");
887                 writel(TW_CONTROL_CLEAR_PCI_ABORT, TW_CONTROL_REG_ADDR(tw_dev));
888                 pci_write_config_word(tw_dev->tw_pci_dev, PCI_STATUS, TW_PCI_CLEAR_PCI_ABORT);
889         }
890
891         if (status_reg_value & TW_STATUS_QUEUE_ERROR) {
892                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing");
893                 writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev));
894         }
895
896         if (status_reg_value & TW_STATUS_MICROCONTROLLER_ERROR) {
897                 if (tw_dev->reset_print == 0) {
898                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x10, "Microcontroller Error: clearing");
899                         tw_dev->reset_print = 1;
900                 }
901                 goto out;
902         }
903         retval = 0;
904 out:
905         return retval;
906 } /* End twa_decode_bits() */
907
908 /* This function will empty the response queue */
909 static int twa_empty_response_queue(TW_Device_Extension *tw_dev)
910 {
911         u32 status_reg_value, response_que_value;
912         int count = 0, retval = 1;
913
914         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
915
916         while (((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) && (count < TW_MAX_RESPONSE_DRAIN)) {
917                 response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
918                 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
919                 count++;
920         }
921         if (count == TW_MAX_RESPONSE_DRAIN)
922                 goto out;
923
924         retval = 0;
925 out:
926         return retval;
927 } /* End twa_empty_response_queue() */
928
929 /* This function will clear the pchip/response queue on 9550SX */
930 static int twa_empty_response_queue_large(TW_Device_Extension *tw_dev)
931 {
932         u32 status_reg_value, response_que_value;
933         int count = 0, retval = 1;
934
935         if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9550SX) {
936                 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
937
938                 while (((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) && (count < TW_MAX_RESPONSE_DRAIN)) {
939                         response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev));
940                         if ((response_que_value & TW_9550SX_DRAIN_COMPLETED) == TW_9550SX_DRAIN_COMPLETED) {
941                                 /* P-chip settle time */
942                                 msleep(500);
943                                 retval = 0;
944                                 goto out;
945                         }
946                         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
947                         count++;
948                 }
949                 if (count == TW_MAX_RESPONSE_DRAIN)
950                         goto out;
951                 
952                 retval = 0;
953         } else
954                 retval = 0;
955 out:
956         return retval;
957 } /* End twa_empty_response_queue_large() */
958
959 /* This function passes sense keys from firmware to scsi layer */
960 static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host)
961 {
962         TW_Command_Full *full_command_packet;
963         unsigned short error;
964         int retval = 1;
965         char *error_str;
966
967         full_command_packet = tw_dev->command_packet_virt[request_id];
968
969         /* Check for embedded error string */
970         error_str = &(full_command_packet->header.err_specific_desc[strlen(full_command_packet->header.err_specific_desc) + 1]);
971
972         /* Don't print error for Logical unit not supported during rollcall */
973         error = full_command_packet->header.status_block.error;
974         if ((error != TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED) && (error != TW_ERROR_UNIT_OFFLINE)) {
975                 if (print_host)
976                         printk(KERN_WARNING "3w-9xxx: scsi%d: ERROR: (0x%02X:0x%04X): %s:%s.\n",
977                                tw_dev->host->host_no,
978                                TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
979                                full_command_packet->header.status_block.error,
980                                error_str[0] == '\0' ?
981                                twa_string_lookup(twa_error_table,
982                                                  full_command_packet->header.status_block.error) : error_str,
983                                full_command_packet->header.err_specific_desc);
984                 else
985                         printk(KERN_WARNING "3w-9xxx: ERROR: (0x%02X:0x%04X): %s:%s.\n",
986                                TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
987                                full_command_packet->header.status_block.error,
988                                error_str[0] == '\0' ?
989                                twa_string_lookup(twa_error_table,
990                                                  full_command_packet->header.status_block.error) : error_str,
991                                full_command_packet->header.err_specific_desc);
992         }
993
994         if (copy_sense) {
995                 memcpy(tw_dev->srb[request_id]->sense_buffer, full_command_packet->header.sense_data, TW_SENSE_DATA_LENGTH);
996                 tw_dev->srb[request_id]->result = (full_command_packet->command.newcommand.status << 1);
997                 retval = TW_ISR_DONT_RESULT;
998                 goto out;
999         }
1000         retval = 0;
1001 out:
1002         return retval;
1003 } /* End twa_fill_sense() */
1004
1005 /* This function will free up device extension resources */
1006 static void twa_free_device_extension(TW_Device_Extension *tw_dev)
1007 {
1008         if (tw_dev->command_packet_virt[0])
1009                 pci_free_consistent(tw_dev->tw_pci_dev,
1010                                     sizeof(TW_Command_Full)*TW_Q_LENGTH,
1011                                     tw_dev->command_packet_virt[0],
1012                                     tw_dev->command_packet_phys[0]);
1013
1014         if (tw_dev->generic_buffer_virt[0])
1015                 pci_free_consistent(tw_dev->tw_pci_dev,
1016                                     TW_SECTOR_SIZE*TW_Q_LENGTH,
1017                                     tw_dev->generic_buffer_virt[0],
1018                                     tw_dev->generic_buffer_phys[0]);
1019
1020         if (tw_dev->event_queue[0])
1021                 kfree(tw_dev->event_queue[0]);
1022 } /* End twa_free_device_extension() */
1023
1024 /* This function will free a request id */
1025 static void twa_free_request_id(TW_Device_Extension *tw_dev, int request_id)
1026 {
1027         tw_dev->free_queue[tw_dev->free_tail] = request_id;
1028         tw_dev->state[request_id] = TW_S_FINISHED;
1029         tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH;
1030 } /* End twa_free_request_id() */
1031
1032 /* This function will get parameter table entires from the firmware */
1033 static void *twa_get_param(TW_Device_Extension *tw_dev, int request_id, int table_id, int parameter_id, int parameter_size_bytes)
1034 {
1035         TW_Command_Full *full_command_packet;
1036         TW_Command *command_packet;
1037         TW_Param_Apache *param;
1038         unsigned long param_value;
1039         void *retval = NULL;
1040
1041         /* Setup the command packet */
1042         full_command_packet = tw_dev->command_packet_virt[request_id];
1043         memset(full_command_packet, 0, sizeof(TW_Command_Full));
1044         command_packet = &full_command_packet->command.oldcommand;
1045
1046         command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM);
1047         command_packet->size              = TW_COMMAND_SIZE;
1048         command_packet->request_id        = request_id;
1049         command_packet->byte6_offset.block_count = 1;
1050
1051         /* Now setup the param */
1052         param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
1053         memset(param, 0, TW_SECTOR_SIZE);
1054         param->table_id = table_id | 0x8000;
1055         param->parameter_id = parameter_id;
1056         param->parameter_size_bytes = parameter_size_bytes;
1057         param_value = tw_dev->generic_buffer_phys[request_id];
1058
1059         command_packet->byte8_offset.param.sgl[0].address = param_value;
1060         command_packet->byte8_offset.param.sgl[0].length = TW_SECTOR_SIZE;
1061
1062         /* Post the command packet to the board */
1063         twa_post_command_packet(tw_dev, request_id, 1);
1064
1065         /* Poll for completion */
1066         if (twa_poll_response(tw_dev, request_id, 30))
1067                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x13, "No valid response during get param")
1068         else
1069                 retval = (void *)&(param->data[0]);
1070
1071         tw_dev->posted_request_count--;
1072         tw_dev->state[request_id] = TW_S_INITIAL;
1073
1074         return retval;
1075 } /* End twa_get_param() */
1076
1077 /* This function will assign an available request id */
1078 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id)
1079 {
1080         *request_id = tw_dev->free_queue[tw_dev->free_head];
1081         tw_dev->free_head = (tw_dev->free_head + 1) % TW_Q_LENGTH;
1082         tw_dev->state[*request_id] = TW_S_STARTED;
1083 } /* End twa_get_request_id() */
1084
1085 /* This function will send an initconnection command to controller */
1086 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
1087                               u32 set_features, unsigned short current_fw_srl, 
1088                               unsigned short current_fw_arch_id, 
1089                               unsigned short current_fw_branch, 
1090                               unsigned short current_fw_build, 
1091                               unsigned short *fw_on_ctlr_srl, 
1092                               unsigned short *fw_on_ctlr_arch_id, 
1093                               unsigned short *fw_on_ctlr_branch, 
1094                               unsigned short *fw_on_ctlr_build, 
1095                               u32 *init_connect_result)
1096 {
1097         TW_Command_Full *full_command_packet;
1098         TW_Initconnect *tw_initconnect;
1099         int request_id = 0, retval = 1;
1100
1101         /* Initialize InitConnection command packet */
1102         full_command_packet = tw_dev->command_packet_virt[request_id];
1103         memset(full_command_packet, 0, sizeof(TW_Command_Full));
1104         full_command_packet->header.header_desc.size_header = 128;
1105         
1106         tw_initconnect = (TW_Initconnect *)&full_command_packet->command.oldcommand;
1107         tw_initconnect->opcode__reserved = TW_OPRES_IN(0, TW_OP_INIT_CONNECTION);
1108         tw_initconnect->request_id = request_id;
1109         tw_initconnect->message_credits = message_credits;
1110         tw_initconnect->features = set_features;
1111
1112         /* Turn on 64-bit sgl support if we need to */
1113         tw_initconnect->features |= sizeof(dma_addr_t) > 4 ? 1 : 0;
1114
1115         if (set_features & TW_EXTENDED_INIT_CONNECT) {
1116                 tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE_EXTENDED;
1117                 tw_initconnect->fw_srl = current_fw_srl;
1118                 tw_initconnect->fw_arch_id = current_fw_arch_id;
1119                 tw_initconnect->fw_branch = current_fw_branch;
1120                 tw_initconnect->fw_build = current_fw_build;
1121         } else 
1122                 tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE;
1123
1124         /* Send command packet to the board */
1125         twa_post_command_packet(tw_dev, request_id, 1);
1126
1127         /* Poll for completion */
1128         if (twa_poll_response(tw_dev, request_id, 30)) {
1129                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x15, "No valid response during init connection");
1130         } else {
1131                 if (set_features & TW_EXTENDED_INIT_CONNECT) {
1132                         *fw_on_ctlr_srl = tw_initconnect->fw_srl;
1133                         *fw_on_ctlr_arch_id = tw_initconnect->fw_arch_id;
1134                         *fw_on_ctlr_branch = tw_initconnect->fw_branch;
1135                         *fw_on_ctlr_build = tw_initconnect->fw_build;
1136                         *init_connect_result = tw_initconnect->result;
1137                 }
1138                 retval = 0;
1139         }
1140
1141         tw_dev->posted_request_count--;
1142         tw_dev->state[request_id] = TW_S_INITIAL;
1143
1144         return retval;
1145 } /* End twa_initconnection() */
1146
1147 /* This function will initialize the fields of a device extension */
1148 static int twa_initialize_device_extension(TW_Device_Extension *tw_dev)
1149 {
1150         int i, retval = 1;
1151
1152         /* Initialize command packet buffers */
1153         if (twa_allocate_memory(tw_dev, sizeof(TW_Command_Full), 0)) {
1154                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x16, "Command packet memory allocation failed");
1155                 goto out;
1156         }
1157
1158         /* Initialize generic buffer */
1159         if (twa_allocate_memory(tw_dev, TW_SECTOR_SIZE, 1)) {
1160                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x17, "Generic memory allocation failed");
1161                 goto out;
1162         }
1163
1164         /* Allocate event info space */
1165         tw_dev->event_queue[0] = kmalloc(sizeof(TW_Event) * TW_Q_LENGTH, GFP_KERNEL);
1166         if (!tw_dev->event_queue[0]) {
1167                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x18, "Event info memory allocation failed");
1168                 goto out;
1169         }
1170
1171         memset(tw_dev->event_queue[0], 0, sizeof(TW_Event) * TW_Q_LENGTH);
1172
1173         for (i = 0; i < TW_Q_LENGTH; i++) {
1174                 tw_dev->event_queue[i] = (TW_Event *)((unsigned char *)tw_dev->event_queue[0] + (i * sizeof(TW_Event)));
1175                 tw_dev->free_queue[i] = i;
1176                 tw_dev->state[i] = TW_S_INITIAL;
1177         }
1178
1179         tw_dev->pending_head = TW_Q_START;
1180         tw_dev->pending_tail = TW_Q_START;
1181         tw_dev->free_head = TW_Q_START;
1182         tw_dev->free_tail = TW_Q_START;
1183         tw_dev->error_sequence_id = 1;
1184         tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1185
1186         init_MUTEX(&tw_dev->ioctl_sem);
1187         init_waitqueue_head(&tw_dev->ioctl_wqueue);
1188
1189         retval = 0;
1190 out:
1191         return retval;
1192 } /* End twa_initialize_device_extension() */
1193
1194 /* This function is the interrupt service routine */
1195 static irqreturn_t twa_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
1196 {
1197         int request_id, error = 0;
1198         u32 status_reg_value;
1199         TW_Response_Queue response_que;
1200         TW_Command_Full *full_command_packet;
1201         TW_Command *command_packet;
1202         TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance;
1203         int handled = 0;
1204
1205         /* Get the per adapter lock */
1206         spin_lock(tw_dev->host->host_lock);
1207
1208         /* Read the registers */
1209         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1210
1211         /* Check if this is our interrupt, otherwise bail */
1212         if (!(status_reg_value & TW_STATUS_VALID_INTERRUPT))
1213                 goto twa_interrupt_bail;
1214
1215         handled = 1;
1216
1217         /* Check controller for errors */
1218         if (twa_check_bits(status_reg_value)) {
1219                 if (twa_decode_bits(tw_dev, status_reg_value)) {
1220                         TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1221                         goto twa_interrupt_bail;
1222                 }
1223         }
1224
1225         /* Handle host interrupt */
1226         if (status_reg_value & TW_STATUS_HOST_INTERRUPT)
1227                 TW_CLEAR_HOST_INTERRUPT(tw_dev);
1228
1229         /* Handle attention interrupt */
1230         if (status_reg_value & TW_STATUS_ATTENTION_INTERRUPT) {
1231                 TW_CLEAR_ATTENTION_INTERRUPT(tw_dev);
1232                 if (!(test_and_set_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags))) {
1233                         twa_get_request_id(tw_dev, &request_id);
1234
1235                         error = twa_aen_read_queue(tw_dev, request_id);
1236                         if (error) {
1237                                 tw_dev->state[request_id] = TW_S_COMPLETED;
1238                                 twa_free_request_id(tw_dev, request_id);
1239                                 clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
1240                         }
1241                 }
1242         }
1243
1244         /* Handle command interrupt */
1245         if (status_reg_value & TW_STATUS_COMMAND_INTERRUPT) {
1246                 TW_MASK_COMMAND_INTERRUPT(tw_dev);
1247                 /* Drain as many pending commands as we can */
1248                 while (tw_dev->pending_request_count > 0) {
1249                         request_id = tw_dev->pending_queue[tw_dev->pending_head];
1250                         if (tw_dev->state[request_id] != TW_S_PENDING) {
1251                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x19, "Found request id that wasn't pending");
1252                                 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1253                                 goto twa_interrupt_bail;
1254                         }
1255                         if (twa_post_command_packet(tw_dev, request_id, 1)==0) {
1256                                 tw_dev->pending_head = (tw_dev->pending_head + 1) % TW_Q_LENGTH;
1257                                 tw_dev->pending_request_count--;
1258                         } else {
1259                                 /* If we get here, we will continue re-posting on the next command interrupt */
1260                                 break;
1261                         }
1262                 }
1263         }
1264
1265         /* Handle response interrupt */
1266         if (status_reg_value & TW_STATUS_RESPONSE_INTERRUPT) {
1267
1268                 /* Drain the response queue from the board */
1269                 while ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) {
1270                         /* Complete the response */
1271                         response_que.value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
1272                         request_id = TW_RESID_OUT(response_que.response_id);
1273                         full_command_packet = tw_dev->command_packet_virt[request_id];
1274                         error = 0;
1275                         command_packet = &full_command_packet->command.oldcommand;
1276                         /* Check for command packet errors */
1277                         if (full_command_packet->command.newcommand.status != 0) {
1278                                 if (tw_dev->srb[request_id] != 0) {
1279                                         error = twa_fill_sense(tw_dev, request_id, 1, 1);
1280                                 } else {
1281                                         /* Skip ioctl error prints */
1282                                         if (request_id != tw_dev->chrdev_request_id) {
1283                                                 error = twa_fill_sense(tw_dev, request_id, 0, 1);
1284                                         }
1285                                 }
1286                         }
1287
1288                         /* Check for correct state */
1289                         if (tw_dev->state[request_id] != TW_S_POSTED) {
1290                                 if (tw_dev->srb[request_id] != 0) {
1291                                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1a, "Received a request id that wasn't posted");
1292                                         TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1293                                         goto twa_interrupt_bail;
1294                                 }
1295                         }
1296
1297                         /* Check for internal command completion */
1298                         if (tw_dev->srb[request_id] == 0) {
1299                                 if (request_id != tw_dev->chrdev_request_id) {
1300                                         if (twa_aen_complete(tw_dev, request_id))
1301                                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1b, "Error completing AEN during attention interrupt");
1302                                 } else {
1303                                         tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1304                                         wake_up(&tw_dev->ioctl_wqueue);
1305                                 }
1306                         } else {
1307                                 twa_scsiop_execute_scsi_complete(tw_dev, request_id);
1308                                 /* If no error command was a success */
1309                                 if (error == 0) {
1310                                         tw_dev->srb[request_id]->result = (DID_OK << 16);
1311                                 }
1312
1313                                 /* If error, command failed */
1314                                 if (error == 1) {
1315                                         /* Ask for a host reset */
1316                                         tw_dev->srb[request_id]->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
1317                                 }
1318
1319                                 /* Report residual bytes for single sgl */
1320                                 if ((tw_dev->srb[request_id]->use_sg <= 1) && (full_command_packet->command.newcommand.status == 0)) {
1321                                         if (full_command_packet->command.newcommand.sg_list[0].length < tw_dev->srb[request_id]->request_bufflen)
1322                                                 tw_dev->srb[request_id]->resid = tw_dev->srb[request_id]->request_bufflen - full_command_packet->command.newcommand.sg_list[0].length;
1323                                 }
1324
1325                                 /* Now complete the io */
1326                                 tw_dev->state[request_id] = TW_S_COMPLETED;
1327                                 twa_free_request_id(tw_dev, request_id);
1328                                 tw_dev->posted_request_count--;
1329                                 tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
1330                                 twa_unmap_scsi_data(tw_dev, request_id);
1331                         }
1332
1333                         /* Check for valid status after each drain */
1334                         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1335                         if (twa_check_bits(status_reg_value)) {
1336                                 if (twa_decode_bits(tw_dev, status_reg_value)) {
1337                                         TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1338                                         goto twa_interrupt_bail;
1339                                 }
1340                         }
1341                 }
1342         }
1343
1344 twa_interrupt_bail:
1345         spin_unlock(tw_dev->host->host_lock);
1346         return IRQ_RETVAL(handled);
1347 } /* End twa_interrupt() */
1348
1349 /* This function will load the request id and various sgls for ioctls */
1350 static void twa_load_sgl(TW_Command_Full *full_command_packet, int request_id, dma_addr_t dma_handle, int length)
1351 {
1352         TW_Command *oldcommand;
1353         TW_Command_Apache *newcommand;
1354         TW_SG_Entry *sgl;
1355
1356         if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
1357                 newcommand = &full_command_packet->command.newcommand;
1358                 newcommand->request_id__lunl = 
1359                         TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id);
1360                 newcommand->sg_list[0].address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1;
1361                 newcommand->sg_list[0].length = length;
1362                 newcommand->sgl_entries__lunh =
1363                         TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), 1);
1364         } else {
1365                 oldcommand = &full_command_packet->command.oldcommand;
1366                 oldcommand->request_id = request_id;
1367
1368                 if (TW_SGL_OUT(oldcommand->opcode__sgloffset)) {
1369                         /* Load the sg list */
1370                         sgl = (TW_SG_Entry *)((u32 *)oldcommand+TW_SGL_OUT(oldcommand->opcode__sgloffset));
1371                         sgl->address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1;
1372                         sgl->length = length;
1373
1374                         if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4))
1375                                 oldcommand->size += 1;
1376                 }
1377         }
1378 } /* End twa_load_sgl() */
1379
1380 /* This function will perform a pci-dma mapping for a scatter gather list */
1381 static int twa_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id)
1382 {
1383         int use_sg;
1384         struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1385         struct pci_dev *pdev = tw_dev->tw_pci_dev;
1386         int retval = 0;
1387
1388         if (cmd->use_sg == 0)
1389                 goto out;
1390
1391         use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, DMA_BIDIRECTIONAL);
1392
1393         if (use_sg == 0) {
1394                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter gather list");
1395                 goto out;
1396         }
1397
1398         cmd->SCp.phase = TW_PHASE_SGLIST;
1399         cmd->SCp.have_data_in = use_sg;
1400         retval = use_sg;
1401 out:
1402         return retval;
1403 } /* End twa_map_scsi_sg_data() */
1404
1405 /* This function will perform a pci-dma map for a single buffer */
1406 static dma_addr_t twa_map_scsi_single_data(TW_Device_Extension *tw_dev, int request_id)
1407 {
1408         dma_addr_t mapping;
1409         struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1410         struct pci_dev *pdev = tw_dev->tw_pci_dev;
1411         int retval = 0;
1412
1413         if (cmd->request_bufflen == 0) {
1414                 retval = 0;
1415                 goto out;
1416         }
1417
1418         mapping = pci_map_single(pdev, cmd->request_buffer, cmd->request_bufflen, DMA_BIDIRECTIONAL);
1419
1420         if (mapping == 0) {
1421                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1d, "Failed to map page");
1422                 goto out;
1423         }
1424
1425         cmd->SCp.phase = TW_PHASE_SINGLE;
1426         cmd->SCp.have_data_in = mapping;
1427         retval = mapping;
1428 out:
1429         return retval;
1430 } /* End twa_map_scsi_single_data() */
1431
1432 /* This function will poll for a response interrupt of a request */
1433 static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds)
1434 {
1435         int retval = 1, found = 0, response_request_id;
1436         TW_Response_Queue response_queue;
1437         TW_Command_Full *full_command_packet = tw_dev->command_packet_virt[request_id];
1438
1439         if (twa_poll_status_gone(tw_dev, TW_STATUS_RESPONSE_QUEUE_EMPTY, seconds) == 0) {
1440                 response_queue.value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
1441                 response_request_id = TW_RESID_OUT(response_queue.response_id);
1442                 if (request_id != response_request_id) {
1443                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1e, "Found unexpected request id while polling for response");
1444                         goto out;
1445                 }
1446                 if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
1447                         if (full_command_packet->command.newcommand.status != 0) {
1448                                 /* bad response */
1449                                 twa_fill_sense(tw_dev, request_id, 0, 0);
1450                                 goto out;
1451                         }
1452                         found = 1;
1453                 } else {
1454                         if (full_command_packet->command.oldcommand.status != 0) {
1455                                 /* bad response */
1456                                 twa_fill_sense(tw_dev, request_id, 0, 0);
1457                                 goto out;
1458                         }
1459                         found = 1;
1460                 }
1461         }
1462
1463         if (found)
1464                 retval = 0;
1465 out:
1466         return retval;
1467 } /* End twa_poll_response() */
1468
1469 /* This function will poll the status register for a flag */
1470 static int twa_poll_status(TW_Device_Extension *tw_dev, u32 flag, int seconds)
1471 {
1472         u32 status_reg_value; 
1473         unsigned long before;
1474         int retval = 1;
1475
1476         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1477         before = jiffies;
1478
1479         if (twa_check_bits(status_reg_value))
1480                 twa_decode_bits(tw_dev, status_reg_value);
1481
1482         while ((status_reg_value & flag) != flag) {
1483                 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1484
1485                 if (twa_check_bits(status_reg_value))
1486                         twa_decode_bits(tw_dev, status_reg_value);
1487
1488                 if (time_after(jiffies, before + HZ * seconds))
1489                         goto out;
1490
1491                 msleep(50);
1492         }
1493         retval = 0;
1494 out:
1495         return retval;
1496 } /* End twa_poll_status() */
1497
1498 /* This function will poll the status register for disappearance of a flag */
1499 static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int seconds)
1500 {
1501         u32 status_reg_value;
1502         unsigned long before;
1503         int retval = 1;
1504
1505         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1506         before = jiffies;
1507
1508         if (twa_check_bits(status_reg_value))
1509                 twa_decode_bits(tw_dev, status_reg_value);
1510
1511         while ((status_reg_value & flag) != 0) {
1512                 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1513                 if (twa_check_bits(status_reg_value))
1514                         twa_decode_bits(tw_dev, status_reg_value);
1515
1516                 if (time_after(jiffies, before + HZ * seconds))
1517                         goto out;
1518
1519                 msleep(50);
1520         }
1521         retval = 0;
1522 out:
1523         return retval;
1524 } /* End twa_poll_status_gone() */
1525
1526 /* This function will attempt to post a command packet to the board */
1527 static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, char internal)
1528 {
1529         u32 status_reg_value;
1530         dma_addr_t command_que_value;
1531         int retval = 1;
1532
1533         command_que_value = tw_dev->command_packet_phys[request_id];
1534         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1535
1536         if (twa_check_bits(status_reg_value))
1537                 twa_decode_bits(tw_dev, status_reg_value);
1538
1539         if (((tw_dev->pending_request_count > 0) && (tw_dev->state[request_id] != TW_S_PENDING)) || (status_reg_value & TW_STATUS_COMMAND_QUEUE_FULL)) {
1540
1541                 /* Only pend internal driver commands */
1542                 if (!internal) {
1543                         retval = SCSI_MLQUEUE_HOST_BUSY;
1544                         goto out;
1545                 }
1546
1547                 /* Couldn't post the command packet, so we do it later */
1548                 if (tw_dev->state[request_id] != TW_S_PENDING) {
1549                         tw_dev->state[request_id] = TW_S_PENDING;
1550                         tw_dev->pending_request_count++;
1551                         if (tw_dev->pending_request_count > tw_dev->max_pending_request_count) {
1552                                 tw_dev->max_pending_request_count = tw_dev->pending_request_count;
1553                         }
1554                         tw_dev->pending_queue[tw_dev->pending_tail] = request_id;
1555                         tw_dev->pending_tail = (tw_dev->pending_tail + 1) % TW_Q_LENGTH;
1556                 }
1557                 TW_UNMASK_COMMAND_INTERRUPT(tw_dev);
1558                 goto out;
1559         } else {
1560                 /* We successfully posted the command packet */
1561                 if (sizeof(dma_addr_t) > 4) {
1562                         command_que_value += TW_COMMAND_OFFSET;
1563                         writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
1564                         writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4);
1565                 } else {
1566                         writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
1567                 }
1568                 tw_dev->state[request_id] = TW_S_POSTED;
1569                 tw_dev->posted_request_count++;
1570                 if (tw_dev->posted_request_count > tw_dev->max_posted_request_count) {
1571                         tw_dev->max_posted_request_count = tw_dev->posted_request_count;
1572                 }
1573         }
1574         retval = 0;
1575 out:
1576         return retval;
1577 } /* End twa_post_command_packet() */
1578
1579 /* This function will reset a device extension */
1580 static int twa_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_reset)
1581 {
1582         int i = 0;
1583         int retval = 1;
1584         unsigned long flags = 0;
1585
1586         set_bit(TW_IN_RESET, &tw_dev->flags);
1587         TW_DISABLE_INTERRUPTS(tw_dev);
1588         TW_MASK_COMMAND_INTERRUPT(tw_dev);
1589         spin_lock_irqsave(tw_dev->host->host_lock, flags);
1590
1591         /* Abort all requests that are in progress */
1592         for (i = 0; i < TW_Q_LENGTH; i++) {
1593                 if ((tw_dev->state[i] != TW_S_FINISHED) &&
1594                     (tw_dev->state[i] != TW_S_INITIAL) &&
1595                     (tw_dev->state[i] != TW_S_COMPLETED)) {
1596                         if (tw_dev->srb[i]) {
1597                                 tw_dev->srb[i]->result = (DID_RESET << 16);
1598                                 tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
1599                                 twa_unmap_scsi_data(tw_dev, i);
1600                         }
1601                 }
1602         }
1603
1604         /* Reset queues and counts */
1605         for (i = 0; i < TW_Q_LENGTH; i++) {
1606                 tw_dev->free_queue[i] = i;
1607                 tw_dev->state[i] = TW_S_INITIAL;
1608         }
1609         tw_dev->free_head = TW_Q_START;
1610         tw_dev->free_tail = TW_Q_START;
1611         tw_dev->posted_request_count = 0;
1612         tw_dev->pending_request_count = 0;
1613         tw_dev->pending_head = TW_Q_START;
1614         tw_dev->pending_tail = TW_Q_START;
1615         tw_dev->reset_print = 0;
1616
1617         spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
1618
1619         if (twa_reset_sequence(tw_dev, 1))
1620                 goto out;
1621
1622         TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
1623
1624         /* Wake up any ioctl that was pending before the reset */
1625         if ((tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE) || (ioctl_reset)) {
1626                 clear_bit(TW_IN_RESET, &tw_dev->flags);
1627         } else {
1628                 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1629                 wake_up(&tw_dev->ioctl_wqueue);
1630         }
1631         retval = 0;
1632 out:
1633         return retval;
1634 } /* End twa_reset_device_extension() */
1635
1636 /* This function will reset a controller */
1637 static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset)
1638 {
1639         int tries = 0, retval = 1, flashed = 0, do_soft_reset = soft_reset;
1640
1641         while (tries < TW_MAX_RESET_TRIES) {
1642                 if (do_soft_reset) {
1643                         TW_SOFT_RESET(tw_dev);
1644                         /* Clear pchip/response queue on 9550SX */
1645                         if (twa_empty_response_queue_large(tw_dev)) {
1646                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x36, "Response queue (large) empty failed during reset sequence");
1647                                 do_soft_reset = 1;
1648                                 tries++;
1649                                 continue;
1650                         }
1651                 }
1652
1653                 /* Make sure controller is in a good state */
1654                 if (twa_poll_status(tw_dev, TW_STATUS_MICROCONTROLLER_READY | (do_soft_reset == 1 ? TW_STATUS_ATTENTION_INTERRUPT : 0), 60)) {
1655                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1f, "Microcontroller not ready during reset sequence");
1656                         do_soft_reset = 1;
1657                         tries++;
1658                         continue;
1659                 }
1660
1661                 /* Empty response queue */
1662                 if (twa_empty_response_queue(tw_dev)) {
1663                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x20, "Response queue empty failed during reset sequence");
1664                         do_soft_reset = 1;
1665                         tries++;
1666                         continue;
1667                 }
1668
1669                 flashed = 0;
1670
1671                 /* Check for compatibility/flash */
1672                 if (twa_check_srl(tw_dev, &flashed)) {
1673                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x21, "Compatibility check failed during reset sequence");
1674                         do_soft_reset = 1;
1675                         tries++;
1676                         continue;
1677                 } else {
1678                         if (flashed) {
1679                                 tries++;
1680                                 continue;
1681                         }
1682                 }
1683
1684                 /* Drain the AEN queue */
1685                 if (twa_aen_drain_queue(tw_dev, soft_reset)) {
1686                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x22, "AEN drain failed during reset sequence");
1687                         do_soft_reset = 1;
1688                         tries++;
1689                         continue;
1690                 }
1691
1692                 /* If we got here, controller is in a good state */
1693                 retval = 0;
1694                 goto out;
1695         }
1696 out:
1697         return retval;
1698 } /* End twa_reset_sequence() */
1699
1700 /* This funciton returns unit geometry in cylinders/heads/sectors */
1701 static int twa_scsi_biosparam(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int geom[])
1702 {
1703         int heads, sectors, cylinders;
1704         TW_Device_Extension *tw_dev;
1705
1706         tw_dev = (TW_Device_Extension *)sdev->host->hostdata;
1707
1708         if (capacity >= 0x200000) {
1709                 heads = 255;
1710                 sectors = 63;
1711                 cylinders = sector_div(capacity, heads * sectors);
1712         } else {
1713                 heads = 64;
1714                 sectors = 32;
1715                 cylinders = sector_div(capacity, heads * sectors);
1716         }
1717
1718         geom[0] = heads;
1719         geom[1] = sectors;
1720         geom[2] = cylinders;
1721
1722         return 0;
1723 } /* End twa_scsi_biosparam() */
1724
1725 /* This is the new scsi eh reset function */
1726 static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt)
1727 {
1728         TW_Device_Extension *tw_dev = NULL;
1729         int retval = FAILED;
1730
1731         tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1732
1733         tw_dev->num_resets++;
1734
1735         printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Unit #%d: Command (0x%x) timed out, resetting card.\n", tw_dev->host->host_no, TW_DRIVER, 0x2c, SCpnt->device->id, SCpnt->cmnd[0]);
1736
1737         /* Now reset the card and some of the device extension data */
1738         if (twa_reset_device_extension(tw_dev, 0)) {
1739                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset failed during scsi host reset");
1740                 goto out;
1741         }
1742
1743         retval = SUCCESS;
1744 out:
1745         return retval;
1746 } /* End twa_scsi_eh_reset() */
1747
1748 /* This is the main scsi queue function to handle scsi opcodes */
1749 static int twa_scsi_queue(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
1750 {
1751         int request_id, retval;
1752         TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1753
1754         /* Check if this FW supports luns */
1755         if ((SCpnt->device->lun != 0) && (tw_dev->working_srl < TW_FW_SRL_LUNS_SUPPORTED)) {
1756                 SCpnt->result = (DID_BAD_TARGET << 16);
1757                 done(SCpnt);
1758                 retval = 0;
1759                 goto out;
1760         }
1761
1762         /* Save done function into scsi_cmnd struct */
1763         SCpnt->scsi_done = done;
1764                 
1765         /* Get a free request id */
1766         twa_get_request_id(tw_dev, &request_id);
1767
1768         /* Save the scsi command for use by the ISR */
1769         tw_dev->srb[request_id] = SCpnt;
1770
1771         /* Initialize phase to zero */
1772         SCpnt->SCp.phase = TW_PHASE_INITIAL;
1773
1774         retval = twa_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL);
1775         switch (retval) {
1776         case SCSI_MLQUEUE_HOST_BUSY:
1777                 twa_free_request_id(tw_dev, request_id);
1778                 break;
1779         case 1:
1780                 tw_dev->state[request_id] = TW_S_COMPLETED;
1781                 twa_free_request_id(tw_dev, request_id);
1782                 SCpnt->result = (DID_ERROR << 16);
1783                 done(SCpnt);
1784                 retval = 0;
1785         }
1786 out:
1787         return retval;
1788 } /* End twa_scsi_queue() */
1789
1790 /* This function hands scsi cdb's to the firmware */
1791 static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg)
1792 {
1793         TW_Command_Full *full_command_packet;
1794         TW_Command_Apache *command_packet;
1795         u32 num_sectors = 0x0;
1796         int i, sg_count;
1797         struct scsi_cmnd *srb = NULL;
1798         struct scatterlist *sglist = NULL;
1799         u32 buffaddr = 0x0;
1800         int retval = 1;
1801
1802         if (tw_dev->srb[request_id]) {
1803                 if (tw_dev->srb[request_id]->request_buffer) {
1804                         sglist = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
1805                 }
1806                 srb = tw_dev->srb[request_id];
1807         }
1808
1809         /* Initialize command packet */
1810         full_command_packet = tw_dev->command_packet_virt[request_id];
1811         full_command_packet->header.header_desc.size_header = 128;
1812         full_command_packet->header.status_block.error = 0;
1813         full_command_packet->header.status_block.severity__reserved = 0;
1814
1815         command_packet = &full_command_packet->command.newcommand;
1816         command_packet->status = 0;
1817         command_packet->opcode__reserved = TW_OPRES_IN(0, TW_OP_EXECUTE_SCSI);
1818
1819         /* We forced 16 byte cdb use earlier */
1820         if (!cdb)
1821                 memcpy(command_packet->cdb, srb->cmnd, TW_MAX_CDB_LEN);
1822         else
1823                 memcpy(command_packet->cdb, cdb, TW_MAX_CDB_LEN);
1824
1825         if (srb) {
1826                 command_packet->unit = srb->device->id;
1827                 command_packet->request_id__lunl =
1828                         TW_REQ_LUN_IN(srb->device->lun, request_id);
1829         } else {
1830                 command_packet->request_id__lunl =
1831                         TW_REQ_LUN_IN(0, request_id);
1832                 command_packet->unit = 0;
1833         }
1834
1835         command_packet->sgl_offset = 16;
1836
1837         if (!sglistarg) {
1838                 /* Map sglist from scsi layer to cmd packet */
1839                 if (tw_dev->srb[request_id]->use_sg == 0) {
1840                         if (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH) {
1841                                 command_packet->sg_list[0].address = tw_dev->generic_buffer_phys[request_id];
1842                                 command_packet->sg_list[0].length = TW_MIN_SGL_LENGTH;
1843                                 if (tw_dev->srb[request_id]->sc_data_direction == DMA_TO_DEVICE || tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL)
1844                                         memcpy(tw_dev->generic_buffer_virt[request_id], tw_dev->srb[request_id]->request_buffer, tw_dev->srb[request_id]->request_bufflen);
1845                         } else {
1846                                 buffaddr = twa_map_scsi_single_data(tw_dev, request_id);
1847                                 if (buffaddr == 0)
1848                                         goto out;
1849
1850                                 command_packet->sg_list[0].address = buffaddr;
1851                                 command_packet->sg_list[0].length = tw_dev->srb[request_id]->request_bufflen;
1852                         }
1853                         command_packet->sgl_entries__lunh = TW_REQ_LUN_IN((srb->device->lun >> 4), 1);
1854
1855                         if (command_packet->sg_list[0].address & TW_ALIGNMENT_9000_SGL) {
1856                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2d, "Found unaligned address during execute scsi");
1857                                 goto out;
1858                         }
1859                 }
1860
1861                 if (tw_dev->srb[request_id]->use_sg > 0) {
1862                         if ((tw_dev->srb[request_id]->use_sg == 1) && (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH)) {
1863                                 if (tw_dev->srb[request_id]->sc_data_direction == DMA_TO_DEVICE || tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL) {
1864                                         struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
1865                                         char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
1866                                         memcpy(tw_dev->generic_buffer_virt[request_id], buf, sg->length);
1867                                         kunmap_atomic(buf - sg->offset, KM_IRQ0);
1868                                 }
1869                                 command_packet->sg_list[0].address = tw_dev->generic_buffer_phys[request_id];
1870                                 command_packet->sg_list[0].length = TW_MIN_SGL_LENGTH;
1871                         } else {
1872                                 sg_count = twa_map_scsi_sg_data(tw_dev, request_id);
1873                                 if (sg_count == 0)
1874                                         goto out;
1875
1876                                 for (i = 0; i < sg_count; i++) {
1877                                         command_packet->sg_list[i].address = sg_dma_address(&sglist[i]);
1878                                         command_packet->sg_list[i].length = sg_dma_len(&sglist[i]);
1879                                         if (command_packet->sg_list[i].address & TW_ALIGNMENT_9000_SGL) {
1880                                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2e, "Found unaligned sgl address during execute scsi");
1881                                                 goto out;
1882                                         }
1883                                 }
1884                         }
1885                         command_packet->sgl_entries__lunh = TW_REQ_LUN_IN((srb->device->lun >> 4), tw_dev->srb[request_id]->use_sg);
1886                 }
1887         } else {
1888                 /* Internal cdb post */
1889                 for (i = 0; i < use_sg; i++) {
1890                         command_packet->sg_list[i].address = sglistarg[i].address;
1891                         command_packet->sg_list[i].length = sglistarg[i].length;
1892                         if (command_packet->sg_list[i].address & TW_ALIGNMENT_9000_SGL) {
1893                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2f, "Found unaligned sgl address during internal post");
1894                                 goto out;
1895                         }
1896                 }
1897                 command_packet->sgl_entries__lunh = TW_REQ_LUN_IN(0, use_sg);
1898         }
1899
1900         if (srb) {
1901                 if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == WRITE_6)
1902                         num_sectors = (u32)srb->cmnd[4];
1903
1904                 if (srb->cmnd[0] == READ_10 || srb->cmnd[0] == WRITE_10)
1905                         num_sectors = (u32)srb->cmnd[8] | ((u32)srb->cmnd[7] << 8);
1906         }
1907
1908         /* Update sector statistic */
1909         tw_dev->sector_count = num_sectors;
1910         if (tw_dev->sector_count > tw_dev->max_sector_count)
1911                 tw_dev->max_sector_count = tw_dev->sector_count;
1912
1913         /* Update SG statistics */
1914         if (srb) {
1915                 tw_dev->sgl_entries = tw_dev->srb[request_id]->use_sg;
1916                 if (tw_dev->sgl_entries > tw_dev->max_sgl_entries)
1917                         tw_dev->max_sgl_entries = tw_dev->sgl_entries;
1918         }
1919
1920         /* Now post the command to the board */
1921         if (srb) {
1922                 retval = twa_post_command_packet(tw_dev, request_id, 0);
1923         } else {
1924                 twa_post_command_packet(tw_dev, request_id, 1);
1925                 retval = 0;
1926         }
1927 out:
1928         return retval;
1929 } /* End twa_scsiop_execute_scsi() */
1930
1931 /* This function completes an execute scsi operation */
1932 static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id)
1933 {
1934         if (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH &&
1935             (tw_dev->srb[request_id]->sc_data_direction == DMA_FROM_DEVICE ||
1936              tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL)) {
1937                 if (tw_dev->srb[request_id]->use_sg == 0) {
1938                         memcpy(tw_dev->srb[request_id]->request_buffer,
1939                                tw_dev->generic_buffer_virt[request_id],
1940                                tw_dev->srb[request_id]->request_bufflen);
1941                 }
1942                 if (tw_dev->srb[request_id]->use_sg == 1) {
1943                         struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
1944                         char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
1945                         memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length);
1946                         kunmap_atomic(buf - sg->offset, KM_IRQ0);
1947                 }
1948         }
1949 } /* End twa_scsiop_execute_scsi_complete() */
1950
1951 /* This function tells the controller to shut down */
1952 static void __twa_shutdown(TW_Device_Extension *tw_dev)
1953 {
1954         /* Disable interrupts */
1955         TW_DISABLE_INTERRUPTS(tw_dev);
1956
1957         printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no);
1958
1959         /* Tell the card we are shutting down */
1960         if (twa_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) {
1961                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x31, "Connection shutdown failed");
1962         } else {
1963                 printk(KERN_WARNING "3w-9xxx: Shutdown complete.\n");
1964         }
1965
1966         /* Clear all interrupts just before exit */
1967         TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1968 } /* End __twa_shutdown() */
1969
1970 /* Wrapper for __twa_shutdown */
1971 static void twa_shutdown(struct pci_dev *pdev)
1972 {
1973         struct Scsi_Host *host = pci_get_drvdata(pdev);
1974         TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
1975
1976         __twa_shutdown(tw_dev);
1977 } /* End twa_shutdown() */
1978
1979 /* This function will look up a string */
1980 static char *twa_string_lookup(twa_message_type *table, unsigned int code)
1981 {
1982         int index;
1983
1984         for (index = 0; ((code != table[index].code) &&
1985                       (table[index].text != (char *)0)); index++);
1986         return(table[index].text);
1987 } /* End twa_string_lookup() */
1988
1989 /* This function will perform a pci-dma unmap */
1990 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
1991 {
1992         struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1993         struct pci_dev *pdev = tw_dev->tw_pci_dev;
1994
1995         switch(cmd->SCp.phase) {
1996         case TW_PHASE_SINGLE:
1997                 pci_unmap_single(pdev, cmd->SCp.have_data_in, cmd->request_bufflen, DMA_BIDIRECTIONAL);
1998                 break;
1999         case TW_PHASE_SGLIST:
2000                 pci_unmap_sg(pdev, cmd->request_buffer, cmd->use_sg, DMA_BIDIRECTIONAL);
2001                 break;
2002         }
2003 } /* End twa_unmap_scsi_data() */
2004
2005 /* scsi_host_template initializer */
2006 static struct scsi_host_template driver_template = {
2007         .module                 = THIS_MODULE,
2008         .name                   = "3ware 9000 Storage Controller",
2009         .queuecommand           = twa_scsi_queue,
2010         .eh_host_reset_handler  = twa_scsi_eh_reset,
2011         .bios_param             = twa_scsi_biosparam,
2012         .change_queue_depth     = twa_change_queue_depth,
2013         .can_queue              = TW_Q_LENGTH-2,
2014         .this_id                = -1,
2015         .sg_tablesize           = TW_APACHE_MAX_SGL_LENGTH,
2016         .max_sectors            = TW_MAX_SECTORS,
2017         .cmd_per_lun            = TW_MAX_CMDS_PER_LUN,
2018         .use_clustering         = ENABLE_CLUSTERING,
2019         .shost_attrs            = twa_host_attrs,
2020         .emulated               = 1
2021 };
2022
2023 /* This function will probe and initialize a card */
2024 static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
2025 {
2026         struct Scsi_Host *host = NULL;
2027         TW_Device_Extension *tw_dev;
2028         u32 mem_addr;
2029         int retval = -ENODEV;
2030
2031         retval = pci_enable_device(pdev);
2032         if (retval) {
2033                 TW_PRINTK(host, TW_DRIVER, 0x34, "Failed to enable pci device");
2034                 goto out_disable_device;
2035         }
2036
2037         pci_set_master(pdev);
2038
2039         retval = pci_set_dma_mask(pdev, sizeof(dma_addr_t) > 4 ? DMA_64BIT_MASK : DMA_32BIT_MASK);
2040         if (retval) {
2041                 TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask");
2042                 goto out_disable_device;
2043         }
2044
2045         host = scsi_host_alloc(&driver_template, sizeof(TW_Device_Extension));
2046         if (!host) {
2047                 TW_PRINTK(host, TW_DRIVER, 0x24, "Failed to allocate memory for device extension");
2048                 retval = -ENOMEM;
2049                 goto out_disable_device;
2050         }
2051         tw_dev = (TW_Device_Extension *)host->hostdata;
2052
2053         memset(tw_dev, 0, sizeof(TW_Device_Extension));
2054
2055         /* Save values to device extension */
2056         tw_dev->host = host;
2057         tw_dev->tw_pci_dev = pdev;
2058
2059         if (twa_initialize_device_extension(tw_dev)) {
2060                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x25, "Failed to initialize device extension");
2061                 goto out_free_device_extension;
2062         }
2063
2064         /* Request IO regions */
2065         retval = pci_request_regions(pdev, "3w-9xxx");
2066         if (retval) {
2067                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x26, "Failed to get mem region");
2068                 goto out_free_device_extension;
2069         }
2070
2071         if (pdev->device == PCI_DEVICE_ID_3WARE_9000)
2072                 mem_addr = pci_resource_start(pdev, 1);
2073         else
2074                 mem_addr = pci_resource_start(pdev, 2);
2075
2076         /* Save base address */
2077         tw_dev->base_addr = ioremap(mem_addr, PAGE_SIZE);
2078         if (!tw_dev->base_addr) {
2079                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x35, "Failed to ioremap");
2080                 goto out_release_mem_region;
2081         }
2082
2083         /* Disable interrupts on the card */
2084         TW_DISABLE_INTERRUPTS(tw_dev);
2085
2086         /* Initialize the card */
2087         if (twa_reset_sequence(tw_dev, 0))
2088                 goto out_release_mem_region;
2089
2090         /* Set host specific parameters */
2091         host->max_id = TW_MAX_UNITS;
2092         host->max_cmd_len = TW_MAX_CDB_LEN;
2093
2094         /* Channels aren't supported by adapter */
2095         host->max_lun = TW_MAX_LUNS(tw_dev->working_srl);
2096         host->max_channel = 0;
2097
2098         /* Register the card with the kernel SCSI layer */
2099         retval = scsi_add_host(host, &pdev->dev);
2100         if (retval) {
2101                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed");
2102                 goto out_release_mem_region;
2103         }
2104
2105         pci_set_drvdata(pdev, host);
2106
2107         printk(KERN_WARNING "3w-9xxx: scsi%d: Found a 3ware 9000 Storage Controller at 0x%x, IRQ: %d.\n",
2108                host->host_no, mem_addr, pdev->irq);
2109         printk(KERN_WARNING "3w-9xxx: scsi%d: Firmware %s, BIOS %s, Ports: %d.\n",
2110                host->host_no,
2111                (char *)twa_get_param(tw_dev, 0, TW_VERSION_TABLE,
2112                                      TW_PARAM_FWVER, TW_PARAM_FWVER_LENGTH),
2113                (char *)twa_get_param(tw_dev, 1, TW_VERSION_TABLE,
2114                                      TW_PARAM_BIOSVER, TW_PARAM_BIOSVER_LENGTH),
2115                *(int *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE,
2116                                      TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH));
2117
2118         /* Now setup the interrupt handler */
2119         retval = request_irq(pdev->irq, twa_interrupt, SA_SHIRQ, "3w-9xxx", tw_dev);
2120         if (retval) {
2121                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x30, "Error requesting IRQ");
2122                 goto out_remove_host;
2123         }
2124
2125         twa_device_extension_list[twa_device_extension_count] = tw_dev;
2126         twa_device_extension_count++;
2127
2128         /* Re-enable interrupts on the card */
2129         TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
2130
2131         /* Finally, scan the host */
2132         scsi_scan_host(host);
2133
2134         if (twa_major == -1) {
2135                 if ((twa_major = register_chrdev (0, "twa", &twa_fops)) < 0)
2136                         TW_PRINTK(host, TW_DRIVER, 0x29, "Failed to register character device");
2137         }
2138         return 0;
2139
2140 out_remove_host:
2141         scsi_remove_host(host);
2142 out_release_mem_region:
2143         pci_release_regions(pdev);
2144 out_free_device_extension:
2145         twa_free_device_extension(tw_dev);
2146         scsi_host_put(host);
2147 out_disable_device:
2148         pci_disable_device(pdev);
2149
2150         return retval;
2151 } /* End twa_probe() */
2152
2153 /* This function is called to remove a device */
2154 static void twa_remove(struct pci_dev *pdev)
2155 {
2156         struct Scsi_Host *host = pci_get_drvdata(pdev);
2157         TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
2158
2159         scsi_remove_host(tw_dev->host);
2160
2161         /* Unregister character device */
2162         if (twa_major >= 0) {
2163                 unregister_chrdev(twa_major, "twa");
2164                 twa_major = -1;
2165         }
2166
2167         /* Free up the IRQ */
2168         free_irq(tw_dev->tw_pci_dev->irq, tw_dev);
2169
2170         /* Shutdown the card */
2171         __twa_shutdown(tw_dev);
2172
2173         /* Free up the mem region */
2174         pci_release_regions(pdev);
2175
2176         /* Free up device extension resources */
2177         twa_free_device_extension(tw_dev);
2178
2179         scsi_host_put(tw_dev->host);
2180         pci_disable_device(pdev);
2181         twa_device_extension_count--;
2182 } /* End twa_remove() */
2183
2184 /* PCI Devices supported by this driver */
2185 static struct pci_device_id twa_pci_tbl[] __devinitdata = {
2186         { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9000,
2187           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2188         { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX,
2189           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2190         { }
2191 };
2192 MODULE_DEVICE_TABLE(pci, twa_pci_tbl);
2193
2194 /* pci_driver initializer */
2195 static struct pci_driver twa_driver = {
2196         .name           = "3w-9xxx",
2197         .id_table       = twa_pci_tbl,
2198         .probe          = twa_probe,
2199         .remove         = twa_remove,
2200         .shutdown       = twa_shutdown
2201 };
2202
2203 /* This function is called on driver initialization */
2204 static int __init twa_init(void)
2205 {
2206         printk(KERN_WARNING "3ware 9000 Storage Controller device driver for Linux v%s.\n", TW_DRIVER_VERSION);
2207
2208         return pci_module_init(&twa_driver);
2209 } /* End twa_init() */
2210
2211 /* This function is called on driver exit */
2212 static void __exit twa_exit(void)
2213 {
2214         pci_unregister_driver(&twa_driver);
2215 } /* End twa_exit() */
2216
2217 module_init(twa_init);
2218 module_exit(twa_exit);
2219