[SCSI] scsi_end_async() needs to take an uptodate parameter
[sfrench/cifs-2.6.git] / 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         kfree(tw_dev->event_queue[0]);
1021 } /* End twa_free_device_extension() */
1022
1023 /* This function will free a request id */
1024 static void twa_free_request_id(TW_Device_Extension *tw_dev, int request_id)
1025 {
1026         tw_dev->free_queue[tw_dev->free_tail] = request_id;
1027         tw_dev->state[request_id] = TW_S_FINISHED;
1028         tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH;
1029 } /* End twa_free_request_id() */
1030
1031 /* This function will get parameter table entires from the firmware */
1032 static void *twa_get_param(TW_Device_Extension *tw_dev, int request_id, int table_id, int parameter_id, int parameter_size_bytes)
1033 {
1034         TW_Command_Full *full_command_packet;
1035         TW_Command *command_packet;
1036         TW_Param_Apache *param;
1037         unsigned long param_value;
1038         void *retval = NULL;
1039
1040         /* Setup the command packet */
1041         full_command_packet = tw_dev->command_packet_virt[request_id];
1042         memset(full_command_packet, 0, sizeof(TW_Command_Full));
1043         command_packet = &full_command_packet->command.oldcommand;
1044
1045         command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM);
1046         command_packet->size              = TW_COMMAND_SIZE;
1047         command_packet->request_id        = request_id;
1048         command_packet->byte6_offset.block_count = 1;
1049
1050         /* Now setup the param */
1051         param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
1052         memset(param, 0, TW_SECTOR_SIZE);
1053         param->table_id = table_id | 0x8000;
1054         param->parameter_id = parameter_id;
1055         param->parameter_size_bytes = parameter_size_bytes;
1056         param_value = tw_dev->generic_buffer_phys[request_id];
1057
1058         command_packet->byte8_offset.param.sgl[0].address = param_value;
1059         command_packet->byte8_offset.param.sgl[0].length = TW_SECTOR_SIZE;
1060
1061         /* Post the command packet to the board */
1062         twa_post_command_packet(tw_dev, request_id, 1);
1063
1064         /* Poll for completion */
1065         if (twa_poll_response(tw_dev, request_id, 30))
1066                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x13, "No valid response during get param")
1067         else
1068                 retval = (void *)&(param->data[0]);
1069
1070         tw_dev->posted_request_count--;
1071         tw_dev->state[request_id] = TW_S_INITIAL;
1072
1073         return retval;
1074 } /* End twa_get_param() */
1075
1076 /* This function will assign an available request id */
1077 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id)
1078 {
1079         *request_id = tw_dev->free_queue[tw_dev->free_head];
1080         tw_dev->free_head = (tw_dev->free_head + 1) % TW_Q_LENGTH;
1081         tw_dev->state[*request_id] = TW_S_STARTED;
1082 } /* End twa_get_request_id() */
1083
1084 /* This function will send an initconnection command to controller */
1085 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
1086                               u32 set_features, unsigned short current_fw_srl, 
1087                               unsigned short current_fw_arch_id, 
1088                               unsigned short current_fw_branch, 
1089                               unsigned short current_fw_build, 
1090                               unsigned short *fw_on_ctlr_srl, 
1091                               unsigned short *fw_on_ctlr_arch_id, 
1092                               unsigned short *fw_on_ctlr_branch, 
1093                               unsigned short *fw_on_ctlr_build, 
1094                               u32 *init_connect_result)
1095 {
1096         TW_Command_Full *full_command_packet;
1097         TW_Initconnect *tw_initconnect;
1098         int request_id = 0, retval = 1;
1099
1100         /* Initialize InitConnection command packet */
1101         full_command_packet = tw_dev->command_packet_virt[request_id];
1102         memset(full_command_packet, 0, sizeof(TW_Command_Full));
1103         full_command_packet->header.header_desc.size_header = 128;
1104         
1105         tw_initconnect = (TW_Initconnect *)&full_command_packet->command.oldcommand;
1106         tw_initconnect->opcode__reserved = TW_OPRES_IN(0, TW_OP_INIT_CONNECTION);
1107         tw_initconnect->request_id = request_id;
1108         tw_initconnect->message_credits = message_credits;
1109         tw_initconnect->features = set_features;
1110
1111         /* Turn on 64-bit sgl support if we need to */
1112         tw_initconnect->features |= sizeof(dma_addr_t) > 4 ? 1 : 0;
1113
1114         if (set_features & TW_EXTENDED_INIT_CONNECT) {
1115                 tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE_EXTENDED;
1116                 tw_initconnect->fw_srl = current_fw_srl;
1117                 tw_initconnect->fw_arch_id = current_fw_arch_id;
1118                 tw_initconnect->fw_branch = current_fw_branch;
1119                 tw_initconnect->fw_build = current_fw_build;
1120         } else 
1121                 tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE;
1122
1123         /* Send command packet to the board */
1124         twa_post_command_packet(tw_dev, request_id, 1);
1125
1126         /* Poll for completion */
1127         if (twa_poll_response(tw_dev, request_id, 30)) {
1128                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x15, "No valid response during init connection");
1129         } else {
1130                 if (set_features & TW_EXTENDED_INIT_CONNECT) {
1131                         *fw_on_ctlr_srl = tw_initconnect->fw_srl;
1132                         *fw_on_ctlr_arch_id = tw_initconnect->fw_arch_id;
1133                         *fw_on_ctlr_branch = tw_initconnect->fw_branch;
1134                         *fw_on_ctlr_build = tw_initconnect->fw_build;
1135                         *init_connect_result = tw_initconnect->result;
1136                 }
1137                 retval = 0;
1138         }
1139
1140         tw_dev->posted_request_count--;
1141         tw_dev->state[request_id] = TW_S_INITIAL;
1142
1143         return retval;
1144 } /* End twa_initconnection() */
1145
1146 /* This function will initialize the fields of a device extension */
1147 static int twa_initialize_device_extension(TW_Device_Extension *tw_dev)
1148 {
1149         int i, retval = 1;
1150
1151         /* Initialize command packet buffers */
1152         if (twa_allocate_memory(tw_dev, sizeof(TW_Command_Full), 0)) {
1153                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x16, "Command packet memory allocation failed");
1154                 goto out;
1155         }
1156
1157         /* Initialize generic buffer */
1158         if (twa_allocate_memory(tw_dev, TW_SECTOR_SIZE, 1)) {
1159                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x17, "Generic memory allocation failed");
1160                 goto out;
1161         }
1162
1163         /* Allocate event info space */
1164         tw_dev->event_queue[0] = kmalloc(sizeof(TW_Event) * TW_Q_LENGTH, GFP_KERNEL);
1165         if (!tw_dev->event_queue[0]) {
1166                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x18, "Event info memory allocation failed");
1167                 goto out;
1168         }
1169
1170         memset(tw_dev->event_queue[0], 0, sizeof(TW_Event) * TW_Q_LENGTH);
1171
1172         for (i = 0; i < TW_Q_LENGTH; i++) {
1173                 tw_dev->event_queue[i] = (TW_Event *)((unsigned char *)tw_dev->event_queue[0] + (i * sizeof(TW_Event)));
1174                 tw_dev->free_queue[i] = i;
1175                 tw_dev->state[i] = TW_S_INITIAL;
1176         }
1177
1178         tw_dev->pending_head = TW_Q_START;
1179         tw_dev->pending_tail = TW_Q_START;
1180         tw_dev->free_head = TW_Q_START;
1181         tw_dev->free_tail = TW_Q_START;
1182         tw_dev->error_sequence_id = 1;
1183         tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1184
1185         init_MUTEX(&tw_dev->ioctl_sem);
1186         init_waitqueue_head(&tw_dev->ioctl_wqueue);
1187
1188         retval = 0;
1189 out:
1190         return retval;
1191 } /* End twa_initialize_device_extension() */
1192
1193 /* This function is the interrupt service routine */
1194 static irqreturn_t twa_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
1195 {
1196         int request_id, error = 0;
1197         u32 status_reg_value;
1198         TW_Response_Queue response_que;
1199         TW_Command_Full *full_command_packet;
1200         TW_Command *command_packet;
1201         TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance;
1202         int handled = 0;
1203
1204         /* Get the per adapter lock */
1205         spin_lock(tw_dev->host->host_lock);
1206
1207         /* Read the registers */
1208         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1209
1210         /* Check if this is our interrupt, otherwise bail */
1211         if (!(status_reg_value & TW_STATUS_VALID_INTERRUPT))
1212                 goto twa_interrupt_bail;
1213
1214         handled = 1;
1215
1216         /* Check controller for errors */
1217         if (twa_check_bits(status_reg_value)) {
1218                 if (twa_decode_bits(tw_dev, status_reg_value)) {
1219                         TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1220                         goto twa_interrupt_bail;
1221                 }
1222         }
1223
1224         /* Handle host interrupt */
1225         if (status_reg_value & TW_STATUS_HOST_INTERRUPT)
1226                 TW_CLEAR_HOST_INTERRUPT(tw_dev);
1227
1228         /* Handle attention interrupt */
1229         if (status_reg_value & TW_STATUS_ATTENTION_INTERRUPT) {
1230                 TW_CLEAR_ATTENTION_INTERRUPT(tw_dev);
1231                 if (!(test_and_set_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags))) {
1232                         twa_get_request_id(tw_dev, &request_id);
1233
1234                         error = twa_aen_read_queue(tw_dev, request_id);
1235                         if (error) {
1236                                 tw_dev->state[request_id] = TW_S_COMPLETED;
1237                                 twa_free_request_id(tw_dev, request_id);
1238                                 clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
1239                         }
1240                 }
1241         }
1242
1243         /* Handle command interrupt */
1244         if (status_reg_value & TW_STATUS_COMMAND_INTERRUPT) {
1245                 TW_MASK_COMMAND_INTERRUPT(tw_dev);
1246                 /* Drain as many pending commands as we can */
1247                 while (tw_dev->pending_request_count > 0) {
1248                         request_id = tw_dev->pending_queue[tw_dev->pending_head];
1249                         if (tw_dev->state[request_id] != TW_S_PENDING) {
1250                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x19, "Found request id that wasn't pending");
1251                                 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1252                                 goto twa_interrupt_bail;
1253                         }
1254                         if (twa_post_command_packet(tw_dev, request_id, 1)==0) {
1255                                 tw_dev->pending_head = (tw_dev->pending_head + 1) % TW_Q_LENGTH;
1256                                 tw_dev->pending_request_count--;
1257                         } else {
1258                                 /* If we get here, we will continue re-posting on the next command interrupt */
1259                                 break;
1260                         }
1261                 }
1262         }
1263
1264         /* Handle response interrupt */
1265         if (status_reg_value & TW_STATUS_RESPONSE_INTERRUPT) {
1266
1267                 /* Drain the response queue from the board */
1268                 while ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) {
1269                         /* Complete the response */
1270                         response_que.value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
1271                         request_id = TW_RESID_OUT(response_que.response_id);
1272                         full_command_packet = tw_dev->command_packet_virt[request_id];
1273                         error = 0;
1274                         command_packet = &full_command_packet->command.oldcommand;
1275                         /* Check for command packet errors */
1276                         if (full_command_packet->command.newcommand.status != 0) {
1277                                 if (tw_dev->srb[request_id] != 0) {
1278                                         error = twa_fill_sense(tw_dev, request_id, 1, 1);
1279                                 } else {
1280                                         /* Skip ioctl error prints */
1281                                         if (request_id != tw_dev->chrdev_request_id) {
1282                                                 error = twa_fill_sense(tw_dev, request_id, 0, 1);
1283                                         }
1284                                 }
1285                         }
1286
1287                         /* Check for correct state */
1288                         if (tw_dev->state[request_id] != TW_S_POSTED) {
1289                                 if (tw_dev->srb[request_id] != 0) {
1290                                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1a, "Received a request id that wasn't posted");
1291                                         TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1292                                         goto twa_interrupt_bail;
1293                                 }
1294                         }
1295
1296                         /* Check for internal command completion */
1297                         if (tw_dev->srb[request_id] == 0) {
1298                                 if (request_id != tw_dev->chrdev_request_id) {
1299                                         if (twa_aen_complete(tw_dev, request_id))
1300                                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1b, "Error completing AEN during attention interrupt");
1301                                 } else {
1302                                         tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1303                                         wake_up(&tw_dev->ioctl_wqueue);
1304                                 }
1305                         } else {
1306                                 twa_scsiop_execute_scsi_complete(tw_dev, request_id);
1307                                 /* If no error command was a success */
1308                                 if (error == 0) {
1309                                         tw_dev->srb[request_id]->result = (DID_OK << 16);
1310                                 }
1311
1312                                 /* If error, command failed */
1313                                 if (error == 1) {
1314                                         /* Ask for a host reset */
1315                                         tw_dev->srb[request_id]->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
1316                                 }
1317
1318                                 /* Report residual bytes for single sgl */
1319                                 if ((tw_dev->srb[request_id]->use_sg <= 1) && (full_command_packet->command.newcommand.status == 0)) {
1320                                         if (full_command_packet->command.newcommand.sg_list[0].length < tw_dev->srb[request_id]->request_bufflen)
1321                                                 tw_dev->srb[request_id]->resid = tw_dev->srb[request_id]->request_bufflen - full_command_packet->command.newcommand.sg_list[0].length;
1322                                 }
1323
1324                                 /* Now complete the io */
1325                                 tw_dev->state[request_id] = TW_S_COMPLETED;
1326                                 twa_free_request_id(tw_dev, request_id);
1327                                 tw_dev->posted_request_count--;
1328                                 tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
1329                                 twa_unmap_scsi_data(tw_dev, request_id);
1330                         }
1331
1332                         /* Check for valid status after each drain */
1333                         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1334                         if (twa_check_bits(status_reg_value)) {
1335                                 if (twa_decode_bits(tw_dev, status_reg_value)) {
1336                                         TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1337                                         goto twa_interrupt_bail;
1338                                 }
1339                         }
1340                 }
1341         }
1342
1343 twa_interrupt_bail:
1344         spin_unlock(tw_dev->host->host_lock);
1345         return IRQ_RETVAL(handled);
1346 } /* End twa_interrupt() */
1347
1348 /* This function will load the request id and various sgls for ioctls */
1349 static void twa_load_sgl(TW_Command_Full *full_command_packet, int request_id, dma_addr_t dma_handle, int length)
1350 {
1351         TW_Command *oldcommand;
1352         TW_Command_Apache *newcommand;
1353         TW_SG_Entry *sgl;
1354
1355         if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
1356                 newcommand = &full_command_packet->command.newcommand;
1357                 newcommand->request_id__lunl = 
1358                         TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id);
1359                 newcommand->sg_list[0].address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1;
1360                 newcommand->sg_list[0].length = length;
1361                 newcommand->sgl_entries__lunh =
1362                         TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), 1);
1363         } else {
1364                 oldcommand = &full_command_packet->command.oldcommand;
1365                 oldcommand->request_id = request_id;
1366
1367                 if (TW_SGL_OUT(oldcommand->opcode__sgloffset)) {
1368                         /* Load the sg list */
1369                         sgl = (TW_SG_Entry *)((u32 *)oldcommand+TW_SGL_OUT(oldcommand->opcode__sgloffset));
1370                         sgl->address = dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1;
1371                         sgl->length = length;
1372
1373                         if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4))
1374                                 oldcommand->size += 1;
1375                 }
1376         }
1377 } /* End twa_load_sgl() */
1378
1379 /* This function will perform a pci-dma mapping for a scatter gather list */
1380 static int twa_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id)
1381 {
1382         int use_sg;
1383         struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1384         struct pci_dev *pdev = tw_dev->tw_pci_dev;
1385         int retval = 0;
1386
1387         if (cmd->use_sg == 0)
1388                 goto out;
1389
1390         use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, DMA_BIDIRECTIONAL);
1391
1392         if (use_sg == 0) {
1393                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter gather list");
1394                 goto out;
1395         }
1396
1397         cmd->SCp.phase = TW_PHASE_SGLIST;
1398         cmd->SCp.have_data_in = use_sg;
1399         retval = use_sg;
1400 out:
1401         return retval;
1402 } /* End twa_map_scsi_sg_data() */
1403
1404 /* This function will perform a pci-dma map for a single buffer */
1405 static dma_addr_t twa_map_scsi_single_data(TW_Device_Extension *tw_dev, int request_id)
1406 {
1407         dma_addr_t mapping;
1408         struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1409         struct pci_dev *pdev = tw_dev->tw_pci_dev;
1410         int retval = 0;
1411
1412         if (cmd->request_bufflen == 0) {
1413                 retval = 0;
1414                 goto out;
1415         }
1416
1417         mapping = pci_map_single(pdev, cmd->request_buffer, cmd->request_bufflen, DMA_BIDIRECTIONAL);
1418
1419         if (mapping == 0) {
1420                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1d, "Failed to map page");
1421                 goto out;
1422         }
1423
1424         cmd->SCp.phase = TW_PHASE_SINGLE;
1425         cmd->SCp.have_data_in = mapping;
1426         retval = mapping;
1427 out:
1428         return retval;
1429 } /* End twa_map_scsi_single_data() */
1430
1431 /* This function will poll for a response interrupt of a request */
1432 static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds)
1433 {
1434         int retval = 1, found = 0, response_request_id;
1435         TW_Response_Queue response_queue;
1436         TW_Command_Full *full_command_packet = tw_dev->command_packet_virt[request_id];
1437
1438         if (twa_poll_status_gone(tw_dev, TW_STATUS_RESPONSE_QUEUE_EMPTY, seconds) == 0) {
1439                 response_queue.value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
1440                 response_request_id = TW_RESID_OUT(response_queue.response_id);
1441                 if (request_id != response_request_id) {
1442                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1e, "Found unexpected request id while polling for response");
1443                         goto out;
1444                 }
1445                 if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
1446                         if (full_command_packet->command.newcommand.status != 0) {
1447                                 /* bad response */
1448                                 twa_fill_sense(tw_dev, request_id, 0, 0);
1449                                 goto out;
1450                         }
1451                         found = 1;
1452                 } else {
1453                         if (full_command_packet->command.oldcommand.status != 0) {
1454                                 /* bad response */
1455                                 twa_fill_sense(tw_dev, request_id, 0, 0);
1456                                 goto out;
1457                         }
1458                         found = 1;
1459                 }
1460         }
1461
1462         if (found)
1463                 retval = 0;
1464 out:
1465         return retval;
1466 } /* End twa_poll_response() */
1467
1468 /* This function will poll the status register for a flag */
1469 static int twa_poll_status(TW_Device_Extension *tw_dev, u32 flag, int seconds)
1470 {
1471         u32 status_reg_value; 
1472         unsigned long before;
1473         int retval = 1;
1474
1475         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1476         before = jiffies;
1477
1478         if (twa_check_bits(status_reg_value))
1479                 twa_decode_bits(tw_dev, status_reg_value);
1480
1481         while ((status_reg_value & flag) != flag) {
1482                 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1483
1484                 if (twa_check_bits(status_reg_value))
1485                         twa_decode_bits(tw_dev, status_reg_value);
1486
1487                 if (time_after(jiffies, before + HZ * seconds))
1488                         goto out;
1489
1490                 msleep(50);
1491         }
1492         retval = 0;
1493 out:
1494         return retval;
1495 } /* End twa_poll_status() */
1496
1497 /* This function will poll the status register for disappearance of a flag */
1498 static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int seconds)
1499 {
1500         u32 status_reg_value;
1501         unsigned long before;
1502         int retval = 1;
1503
1504         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1505         before = jiffies;
1506
1507         if (twa_check_bits(status_reg_value))
1508                 twa_decode_bits(tw_dev, status_reg_value);
1509
1510         while ((status_reg_value & flag) != 0) {
1511                 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1512                 if (twa_check_bits(status_reg_value))
1513                         twa_decode_bits(tw_dev, status_reg_value);
1514
1515                 if (time_after(jiffies, before + HZ * seconds))
1516                         goto out;
1517
1518                 msleep(50);
1519         }
1520         retval = 0;
1521 out:
1522         return retval;
1523 } /* End twa_poll_status_gone() */
1524
1525 /* This function will attempt to post a command packet to the board */
1526 static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, char internal)
1527 {
1528         u32 status_reg_value;
1529         dma_addr_t command_que_value;
1530         int retval = 1;
1531
1532         command_que_value = tw_dev->command_packet_phys[request_id];
1533         status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1534
1535         if (twa_check_bits(status_reg_value))
1536                 twa_decode_bits(tw_dev, status_reg_value);
1537
1538         if (((tw_dev->pending_request_count > 0) && (tw_dev->state[request_id] != TW_S_PENDING)) || (status_reg_value & TW_STATUS_COMMAND_QUEUE_FULL)) {
1539
1540                 /* Only pend internal driver commands */
1541                 if (!internal) {
1542                         retval = SCSI_MLQUEUE_HOST_BUSY;
1543                         goto out;
1544                 }
1545
1546                 /* Couldn't post the command packet, so we do it later */
1547                 if (tw_dev->state[request_id] != TW_S_PENDING) {
1548                         tw_dev->state[request_id] = TW_S_PENDING;
1549                         tw_dev->pending_request_count++;
1550                         if (tw_dev->pending_request_count > tw_dev->max_pending_request_count) {
1551                                 tw_dev->max_pending_request_count = tw_dev->pending_request_count;
1552                         }
1553                         tw_dev->pending_queue[tw_dev->pending_tail] = request_id;
1554                         tw_dev->pending_tail = (tw_dev->pending_tail + 1) % TW_Q_LENGTH;
1555                 }
1556                 TW_UNMASK_COMMAND_INTERRUPT(tw_dev);
1557                 goto out;
1558         } else {
1559                 /* We successfully posted the command packet */
1560                 if (sizeof(dma_addr_t) > 4) {
1561                         command_que_value += TW_COMMAND_OFFSET;
1562                         writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
1563                         writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4);
1564                 } else {
1565                         writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
1566                 }
1567                 tw_dev->state[request_id] = TW_S_POSTED;
1568                 tw_dev->posted_request_count++;
1569                 if (tw_dev->posted_request_count > tw_dev->max_posted_request_count) {
1570                         tw_dev->max_posted_request_count = tw_dev->posted_request_count;
1571                 }
1572         }
1573         retval = 0;
1574 out:
1575         return retval;
1576 } /* End twa_post_command_packet() */
1577
1578 /* This function will reset a device extension */
1579 static int twa_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_reset)
1580 {
1581         int i = 0;
1582         int retval = 1;
1583         unsigned long flags = 0;
1584
1585         set_bit(TW_IN_RESET, &tw_dev->flags);
1586         TW_DISABLE_INTERRUPTS(tw_dev);
1587         TW_MASK_COMMAND_INTERRUPT(tw_dev);
1588         spin_lock_irqsave(tw_dev->host->host_lock, flags);
1589
1590         /* Abort all requests that are in progress */
1591         for (i = 0; i < TW_Q_LENGTH; i++) {
1592                 if ((tw_dev->state[i] != TW_S_FINISHED) &&
1593                     (tw_dev->state[i] != TW_S_INITIAL) &&
1594                     (tw_dev->state[i] != TW_S_COMPLETED)) {
1595                         if (tw_dev->srb[i]) {
1596                                 tw_dev->srb[i]->result = (DID_RESET << 16);
1597                                 tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
1598                                 twa_unmap_scsi_data(tw_dev, i);
1599                         }
1600                 }
1601         }
1602
1603         /* Reset queues and counts */
1604         for (i = 0; i < TW_Q_LENGTH; i++) {
1605                 tw_dev->free_queue[i] = i;
1606                 tw_dev->state[i] = TW_S_INITIAL;
1607         }
1608         tw_dev->free_head = TW_Q_START;
1609         tw_dev->free_tail = TW_Q_START;
1610         tw_dev->posted_request_count = 0;
1611         tw_dev->pending_request_count = 0;
1612         tw_dev->pending_head = TW_Q_START;
1613         tw_dev->pending_tail = TW_Q_START;
1614         tw_dev->reset_print = 0;
1615
1616         spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
1617
1618         if (twa_reset_sequence(tw_dev, 1))
1619                 goto out;
1620
1621         TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
1622
1623         /* Wake up any ioctl that was pending before the reset */
1624         if ((tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE) || (ioctl_reset)) {
1625                 clear_bit(TW_IN_RESET, &tw_dev->flags);
1626         } else {
1627                 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1628                 wake_up(&tw_dev->ioctl_wqueue);
1629         }
1630         retval = 0;
1631 out:
1632         return retval;
1633 } /* End twa_reset_device_extension() */
1634
1635 /* This function will reset a controller */
1636 static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset)
1637 {
1638         int tries = 0, retval = 1, flashed = 0, do_soft_reset = soft_reset;
1639
1640         while (tries < TW_MAX_RESET_TRIES) {
1641                 if (do_soft_reset) {
1642                         TW_SOFT_RESET(tw_dev);
1643                         /* Clear pchip/response queue on 9550SX */
1644                         if (twa_empty_response_queue_large(tw_dev)) {
1645                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x36, "Response queue (large) empty failed during reset sequence");
1646                                 do_soft_reset = 1;
1647                                 tries++;
1648                                 continue;
1649                         }
1650                 }
1651
1652                 /* Make sure controller is in a good state */
1653                 if (twa_poll_status(tw_dev, TW_STATUS_MICROCONTROLLER_READY | (do_soft_reset == 1 ? TW_STATUS_ATTENTION_INTERRUPT : 0), 60)) {
1654                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1f, "Microcontroller not ready during reset sequence");
1655                         do_soft_reset = 1;
1656                         tries++;
1657                         continue;
1658                 }
1659
1660                 /* Empty response queue */
1661                 if (twa_empty_response_queue(tw_dev)) {
1662                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x20, "Response queue empty failed during reset sequence");
1663                         do_soft_reset = 1;
1664                         tries++;
1665                         continue;
1666                 }
1667
1668                 flashed = 0;
1669
1670                 /* Check for compatibility/flash */
1671                 if (twa_check_srl(tw_dev, &flashed)) {
1672                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x21, "Compatibility check failed during reset sequence");
1673                         do_soft_reset = 1;
1674                         tries++;
1675                         continue;
1676                 } else {
1677                         if (flashed) {
1678                                 tries++;
1679                                 continue;
1680                         }
1681                 }
1682
1683                 /* Drain the AEN queue */
1684                 if (twa_aen_drain_queue(tw_dev, soft_reset)) {
1685                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x22, "AEN drain failed during reset sequence");
1686                         do_soft_reset = 1;
1687                         tries++;
1688                         continue;
1689                 }
1690
1691                 /* If we got here, controller is in a good state */
1692                 retval = 0;
1693                 goto out;
1694         }
1695 out:
1696         return retval;
1697 } /* End twa_reset_sequence() */
1698
1699 /* This funciton returns unit geometry in cylinders/heads/sectors */
1700 static int twa_scsi_biosparam(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int geom[])
1701 {
1702         int heads, sectors, cylinders;
1703         TW_Device_Extension *tw_dev;
1704
1705         tw_dev = (TW_Device_Extension *)sdev->host->hostdata;
1706
1707         if (capacity >= 0x200000) {
1708                 heads = 255;
1709                 sectors = 63;
1710                 cylinders = sector_div(capacity, heads * sectors);
1711         } else {
1712                 heads = 64;
1713                 sectors = 32;
1714                 cylinders = sector_div(capacity, heads * sectors);
1715         }
1716
1717         geom[0] = heads;
1718         geom[1] = sectors;
1719         geom[2] = cylinders;
1720
1721         return 0;
1722 } /* End twa_scsi_biosparam() */
1723
1724 /* This is the new scsi eh reset function */
1725 static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt)
1726 {
1727         TW_Device_Extension *tw_dev = NULL;
1728         int retval = FAILED;
1729
1730         tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1731
1732         tw_dev->num_resets++;
1733
1734         sdev_printk(KERN_WARNING, SCpnt->device,
1735                 "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n",
1736                 TW_DRIVER, 0x2c, SCpnt->cmnd[0]);
1737
1738         /* Now reset the card and some of the device extension data */
1739         if (twa_reset_device_extension(tw_dev, 0)) {
1740                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset failed during scsi host reset");
1741                 goto out;
1742         }
1743
1744         retval = SUCCESS;
1745 out:
1746         return retval;
1747 } /* End twa_scsi_eh_reset() */
1748
1749 /* This is the main scsi queue function to handle scsi opcodes */
1750 static int twa_scsi_queue(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
1751 {
1752         int request_id, retval;
1753         TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1754
1755         /* Check if this FW supports luns */
1756         if ((SCpnt->device->lun != 0) && (tw_dev->working_srl < TW_FW_SRL_LUNS_SUPPORTED)) {
1757                 SCpnt->result = (DID_BAD_TARGET << 16);
1758                 done(SCpnt);
1759                 retval = 0;
1760                 goto out;
1761         }
1762
1763         /* Save done function into scsi_cmnd struct */
1764         SCpnt->scsi_done = done;
1765                 
1766         /* Get a free request id */
1767         twa_get_request_id(tw_dev, &request_id);
1768
1769         /* Save the scsi command for use by the ISR */
1770         tw_dev->srb[request_id] = SCpnt;
1771
1772         /* Initialize phase to zero */
1773         SCpnt->SCp.phase = TW_PHASE_INITIAL;
1774
1775         retval = twa_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL);
1776         switch (retval) {
1777         case SCSI_MLQUEUE_HOST_BUSY:
1778                 twa_free_request_id(tw_dev, request_id);
1779                 break;
1780         case 1:
1781                 tw_dev->state[request_id] = TW_S_COMPLETED;
1782                 twa_free_request_id(tw_dev, request_id);
1783                 SCpnt->result = (DID_ERROR << 16);
1784                 done(SCpnt);
1785                 retval = 0;
1786         }
1787 out:
1788         return retval;
1789 } /* End twa_scsi_queue() */
1790
1791 /* This function hands scsi cdb's to the firmware */
1792 static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg)
1793 {
1794         TW_Command_Full *full_command_packet;
1795         TW_Command_Apache *command_packet;
1796         u32 num_sectors = 0x0;
1797         int i, sg_count;
1798         struct scsi_cmnd *srb = NULL;
1799         struct scatterlist *sglist = NULL;
1800         u32 buffaddr = 0x0;
1801         int retval = 1;
1802
1803         if (tw_dev->srb[request_id]) {
1804                 if (tw_dev->srb[request_id]->request_buffer) {
1805                         sglist = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
1806                 }
1807                 srb = tw_dev->srb[request_id];
1808         }
1809
1810         /* Initialize command packet */
1811         full_command_packet = tw_dev->command_packet_virt[request_id];
1812         full_command_packet->header.header_desc.size_header = 128;
1813         full_command_packet->header.status_block.error = 0;
1814         full_command_packet->header.status_block.severity__reserved = 0;
1815
1816         command_packet = &full_command_packet->command.newcommand;
1817         command_packet->status = 0;
1818         command_packet->opcode__reserved = TW_OPRES_IN(0, TW_OP_EXECUTE_SCSI);
1819
1820         /* We forced 16 byte cdb use earlier */
1821         if (!cdb)
1822                 memcpy(command_packet->cdb, srb->cmnd, TW_MAX_CDB_LEN);
1823         else
1824                 memcpy(command_packet->cdb, cdb, TW_MAX_CDB_LEN);
1825
1826         if (srb) {
1827                 command_packet->unit = srb->device->id;
1828                 command_packet->request_id__lunl =
1829                         TW_REQ_LUN_IN(srb->device->lun, request_id);
1830         } else {
1831                 command_packet->request_id__lunl =
1832                         TW_REQ_LUN_IN(0, request_id);
1833                 command_packet->unit = 0;
1834         }
1835
1836         command_packet->sgl_offset = 16;
1837
1838         if (!sglistarg) {
1839                 /* Map sglist from scsi layer to cmd packet */
1840                 if (tw_dev->srb[request_id]->use_sg == 0) {
1841                         if (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH) {
1842                                 command_packet->sg_list[0].address = tw_dev->generic_buffer_phys[request_id];
1843                                 command_packet->sg_list[0].length = TW_MIN_SGL_LENGTH;
1844                                 if (tw_dev->srb[request_id]->sc_data_direction == DMA_TO_DEVICE || tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL)
1845                                         memcpy(tw_dev->generic_buffer_virt[request_id], tw_dev->srb[request_id]->request_buffer, tw_dev->srb[request_id]->request_bufflen);
1846                         } else {
1847                                 buffaddr = twa_map_scsi_single_data(tw_dev, request_id);
1848                                 if (buffaddr == 0)
1849                                         goto out;
1850
1851                                 command_packet->sg_list[0].address = buffaddr;
1852                                 command_packet->sg_list[0].length = tw_dev->srb[request_id]->request_bufflen;
1853                         }
1854                         command_packet->sgl_entries__lunh = TW_REQ_LUN_IN((srb->device->lun >> 4), 1);
1855
1856                         if (command_packet->sg_list[0].address & TW_ALIGNMENT_9000_SGL) {
1857                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2d, "Found unaligned address during execute scsi");
1858                                 goto out;
1859                         }
1860                 }
1861
1862                 if (tw_dev->srb[request_id]->use_sg > 0) {
1863                         if ((tw_dev->srb[request_id]->use_sg == 1) && (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH)) {
1864                                 if (tw_dev->srb[request_id]->sc_data_direction == DMA_TO_DEVICE || tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL) {
1865                                         struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
1866                                         char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
1867                                         memcpy(tw_dev->generic_buffer_virt[request_id], buf, sg->length);
1868                                         kunmap_atomic(buf - sg->offset, KM_IRQ0);
1869                                 }
1870                                 command_packet->sg_list[0].address = tw_dev->generic_buffer_phys[request_id];
1871                                 command_packet->sg_list[0].length = TW_MIN_SGL_LENGTH;
1872                         } else {
1873                                 sg_count = twa_map_scsi_sg_data(tw_dev, request_id);
1874                                 if (sg_count == 0)
1875                                         goto out;
1876
1877                                 for (i = 0; i < sg_count; i++) {
1878                                         command_packet->sg_list[i].address = sg_dma_address(&sglist[i]);
1879                                         command_packet->sg_list[i].length = sg_dma_len(&sglist[i]);
1880                                         if (command_packet->sg_list[i].address & TW_ALIGNMENT_9000_SGL) {
1881                                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2e, "Found unaligned sgl address during execute scsi");
1882                                                 goto out;
1883                                         }
1884                                 }
1885                         }
1886                         command_packet->sgl_entries__lunh = TW_REQ_LUN_IN((srb->device->lun >> 4), tw_dev->srb[request_id]->use_sg);
1887                 }
1888         } else {
1889                 /* Internal cdb post */
1890                 for (i = 0; i < use_sg; i++) {
1891                         command_packet->sg_list[i].address = sglistarg[i].address;
1892                         command_packet->sg_list[i].length = sglistarg[i].length;
1893                         if (command_packet->sg_list[i].address & TW_ALIGNMENT_9000_SGL) {
1894                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2f, "Found unaligned sgl address during internal post");
1895                                 goto out;
1896                         }
1897                 }
1898                 command_packet->sgl_entries__lunh = TW_REQ_LUN_IN(0, use_sg);
1899         }
1900
1901         if (srb) {
1902                 if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == WRITE_6)
1903                         num_sectors = (u32)srb->cmnd[4];
1904
1905                 if (srb->cmnd[0] == READ_10 || srb->cmnd[0] == WRITE_10)
1906                         num_sectors = (u32)srb->cmnd[8] | ((u32)srb->cmnd[7] << 8);
1907         }
1908
1909         /* Update sector statistic */
1910         tw_dev->sector_count = num_sectors;
1911         if (tw_dev->sector_count > tw_dev->max_sector_count)
1912                 tw_dev->max_sector_count = tw_dev->sector_count;
1913
1914         /* Update SG statistics */
1915         if (srb) {
1916                 tw_dev->sgl_entries = tw_dev->srb[request_id]->use_sg;
1917                 if (tw_dev->sgl_entries > tw_dev->max_sgl_entries)
1918                         tw_dev->max_sgl_entries = tw_dev->sgl_entries;
1919         }
1920
1921         /* Now post the command to the board */
1922         if (srb) {
1923                 retval = twa_post_command_packet(tw_dev, request_id, 0);
1924         } else {
1925                 twa_post_command_packet(tw_dev, request_id, 1);
1926                 retval = 0;
1927         }
1928 out:
1929         return retval;
1930 } /* End twa_scsiop_execute_scsi() */
1931
1932 /* This function completes an execute scsi operation */
1933 static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id)
1934 {
1935         if (tw_dev->srb[request_id]->request_bufflen < TW_MIN_SGL_LENGTH &&
1936             (tw_dev->srb[request_id]->sc_data_direction == DMA_FROM_DEVICE ||
1937              tw_dev->srb[request_id]->sc_data_direction == DMA_BIDIRECTIONAL)) {
1938                 if (tw_dev->srb[request_id]->use_sg == 0) {
1939                         memcpy(tw_dev->srb[request_id]->request_buffer,
1940                                tw_dev->generic_buffer_virt[request_id],
1941                                tw_dev->srb[request_id]->request_bufflen);
1942                 }
1943                 if (tw_dev->srb[request_id]->use_sg == 1) {
1944                         struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
1945                         char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
1946                         memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length);
1947                         kunmap_atomic(buf - sg->offset, KM_IRQ0);
1948                 }
1949         }
1950 } /* End twa_scsiop_execute_scsi_complete() */
1951
1952 /* This function tells the controller to shut down */
1953 static void __twa_shutdown(TW_Device_Extension *tw_dev)
1954 {
1955         /* Disable interrupts */
1956         TW_DISABLE_INTERRUPTS(tw_dev);
1957
1958         printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no);
1959
1960         /* Tell the card we are shutting down */
1961         if (twa_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) {
1962                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x31, "Connection shutdown failed");
1963         } else {
1964                 printk(KERN_WARNING "3w-9xxx: Shutdown complete.\n");
1965         }
1966
1967         /* Clear all interrupts just before exit */
1968         TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1969 } /* End __twa_shutdown() */
1970
1971 /* Wrapper for __twa_shutdown */
1972 static void twa_shutdown(struct pci_dev *pdev)
1973 {
1974         struct Scsi_Host *host = pci_get_drvdata(pdev);
1975         TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
1976
1977         __twa_shutdown(tw_dev);
1978 } /* End twa_shutdown() */
1979
1980 /* This function will look up a string */
1981 static char *twa_string_lookup(twa_message_type *table, unsigned int code)
1982 {
1983         int index;
1984
1985         for (index = 0; ((code != table[index].code) &&
1986                       (table[index].text != (char *)0)); index++);
1987         return(table[index].text);
1988 } /* End twa_string_lookup() */
1989
1990 /* This function will perform a pci-dma unmap */
1991 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
1992 {
1993         struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1994         struct pci_dev *pdev = tw_dev->tw_pci_dev;
1995
1996         switch(cmd->SCp.phase) {
1997         case TW_PHASE_SINGLE:
1998                 pci_unmap_single(pdev, cmd->SCp.have_data_in, cmd->request_bufflen, DMA_BIDIRECTIONAL);
1999                 break;
2000         case TW_PHASE_SGLIST:
2001                 pci_unmap_sg(pdev, cmd->request_buffer, cmd->use_sg, DMA_BIDIRECTIONAL);
2002                 break;
2003         }
2004 } /* End twa_unmap_scsi_data() */
2005
2006 /* scsi_host_template initializer */
2007 static struct scsi_host_template driver_template = {
2008         .module                 = THIS_MODULE,
2009         .name                   = "3ware 9000 Storage Controller",
2010         .queuecommand           = twa_scsi_queue,
2011         .eh_host_reset_handler  = twa_scsi_eh_reset,
2012         .bios_param             = twa_scsi_biosparam,
2013         .change_queue_depth     = twa_change_queue_depth,
2014         .can_queue              = TW_Q_LENGTH-2,
2015         .this_id                = -1,
2016         .sg_tablesize           = TW_APACHE_MAX_SGL_LENGTH,
2017         .max_sectors            = TW_MAX_SECTORS,
2018         .cmd_per_lun            = TW_MAX_CMDS_PER_LUN,
2019         .use_clustering         = ENABLE_CLUSTERING,
2020         .shost_attrs            = twa_host_attrs,
2021         .emulated               = 1
2022 };
2023
2024 /* This function will probe and initialize a card */
2025 static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
2026 {
2027         struct Scsi_Host *host = NULL;
2028         TW_Device_Extension *tw_dev;
2029         u32 mem_addr;
2030         int retval = -ENODEV;
2031
2032         retval = pci_enable_device(pdev);
2033         if (retval) {
2034                 TW_PRINTK(host, TW_DRIVER, 0x34, "Failed to enable pci device");
2035                 goto out_disable_device;
2036         }
2037
2038         pci_set_master(pdev);
2039
2040         retval = pci_set_dma_mask(pdev, sizeof(dma_addr_t) > 4 ? DMA_64BIT_MASK : DMA_32BIT_MASK);
2041         if (retval) {
2042                 TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask");
2043                 goto out_disable_device;
2044         }
2045
2046         host = scsi_host_alloc(&driver_template, sizeof(TW_Device_Extension));
2047         if (!host) {
2048                 TW_PRINTK(host, TW_DRIVER, 0x24, "Failed to allocate memory for device extension");
2049                 retval = -ENOMEM;
2050                 goto out_disable_device;
2051         }
2052         tw_dev = (TW_Device_Extension *)host->hostdata;
2053
2054         memset(tw_dev, 0, sizeof(TW_Device_Extension));
2055
2056         /* Save values to device extension */
2057         tw_dev->host = host;
2058         tw_dev->tw_pci_dev = pdev;
2059
2060         if (twa_initialize_device_extension(tw_dev)) {
2061                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x25, "Failed to initialize device extension");
2062                 goto out_free_device_extension;
2063         }
2064
2065         /* Request IO regions */
2066         retval = pci_request_regions(pdev, "3w-9xxx");
2067         if (retval) {
2068                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x26, "Failed to get mem region");
2069                 goto out_free_device_extension;
2070         }
2071
2072         if (pdev->device == PCI_DEVICE_ID_3WARE_9000)
2073                 mem_addr = pci_resource_start(pdev, 1);
2074         else
2075                 mem_addr = pci_resource_start(pdev, 2);
2076
2077         /* Save base address */
2078         tw_dev->base_addr = ioremap(mem_addr, PAGE_SIZE);
2079         if (!tw_dev->base_addr) {
2080                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x35, "Failed to ioremap");
2081                 goto out_release_mem_region;
2082         }
2083
2084         /* Disable interrupts on the card */
2085         TW_DISABLE_INTERRUPTS(tw_dev);
2086
2087         /* Initialize the card */
2088         if (twa_reset_sequence(tw_dev, 0))
2089                 goto out_release_mem_region;
2090
2091         /* Set host specific parameters */
2092         host->max_id = TW_MAX_UNITS;
2093         host->max_cmd_len = TW_MAX_CDB_LEN;
2094
2095         /* Channels aren't supported by adapter */
2096         host->max_lun = TW_MAX_LUNS(tw_dev->working_srl);
2097         host->max_channel = 0;
2098
2099         /* Register the card with the kernel SCSI layer */
2100         retval = scsi_add_host(host, &pdev->dev);
2101         if (retval) {
2102                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed");
2103                 goto out_release_mem_region;
2104         }
2105
2106         pci_set_drvdata(pdev, host);
2107
2108         printk(KERN_WARNING "3w-9xxx: scsi%d: Found a 3ware 9000 Storage Controller at 0x%x, IRQ: %d.\n",
2109                host->host_no, mem_addr, pdev->irq);
2110         printk(KERN_WARNING "3w-9xxx: scsi%d: Firmware %s, BIOS %s, Ports: %d.\n",
2111                host->host_no,
2112                (char *)twa_get_param(tw_dev, 0, TW_VERSION_TABLE,
2113                                      TW_PARAM_FWVER, TW_PARAM_FWVER_LENGTH),
2114                (char *)twa_get_param(tw_dev, 1, TW_VERSION_TABLE,
2115                                      TW_PARAM_BIOSVER, TW_PARAM_BIOSVER_LENGTH),
2116                *(int *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE,
2117                                      TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH));
2118
2119         /* Now setup the interrupt handler */
2120         retval = request_irq(pdev->irq, twa_interrupt, SA_SHIRQ, "3w-9xxx", tw_dev);
2121         if (retval) {
2122                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x30, "Error requesting IRQ");
2123                 goto out_remove_host;
2124         }
2125
2126         twa_device_extension_list[twa_device_extension_count] = tw_dev;
2127         twa_device_extension_count++;
2128
2129         /* Re-enable interrupts on the card */
2130         TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
2131
2132         /* Finally, scan the host */
2133         scsi_scan_host(host);
2134
2135         if (twa_major == -1) {
2136                 if ((twa_major = register_chrdev (0, "twa", &twa_fops)) < 0)
2137                         TW_PRINTK(host, TW_DRIVER, 0x29, "Failed to register character device");
2138         }
2139         return 0;
2140
2141 out_remove_host:
2142         scsi_remove_host(host);
2143 out_release_mem_region:
2144         pci_release_regions(pdev);
2145 out_free_device_extension:
2146         twa_free_device_extension(tw_dev);
2147         scsi_host_put(host);
2148 out_disable_device:
2149         pci_disable_device(pdev);
2150
2151         return retval;
2152 } /* End twa_probe() */
2153
2154 /* This function is called to remove a device */
2155 static void twa_remove(struct pci_dev *pdev)
2156 {
2157         struct Scsi_Host *host = pci_get_drvdata(pdev);
2158         TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
2159
2160         scsi_remove_host(tw_dev->host);
2161
2162         /* Unregister character device */
2163         if (twa_major >= 0) {
2164                 unregister_chrdev(twa_major, "twa");
2165                 twa_major = -1;
2166         }
2167
2168         /* Free up the IRQ */
2169         free_irq(tw_dev->tw_pci_dev->irq, tw_dev);
2170
2171         /* Shutdown the card */
2172         __twa_shutdown(tw_dev);
2173
2174         /* Free up the mem region */
2175         pci_release_regions(pdev);
2176
2177         /* Free up device extension resources */
2178         twa_free_device_extension(tw_dev);
2179
2180         scsi_host_put(tw_dev->host);
2181         pci_disable_device(pdev);
2182         twa_device_extension_count--;
2183 } /* End twa_remove() */
2184
2185 /* PCI Devices supported by this driver */
2186 static struct pci_device_id twa_pci_tbl[] __devinitdata = {
2187         { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9000,
2188           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2189         { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX,
2190           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2191         { }
2192 };
2193 MODULE_DEVICE_TABLE(pci, twa_pci_tbl);
2194
2195 /* pci_driver initializer */
2196 static struct pci_driver twa_driver = {
2197         .name           = "3w-9xxx",
2198         .id_table       = twa_pci_tbl,
2199         .probe          = twa_probe,
2200         .remove         = twa_remove,
2201         .shutdown       = twa_shutdown
2202 };
2203
2204 /* This function is called on driver initialization */
2205 static int __init twa_init(void)
2206 {
2207         printk(KERN_WARNING "3ware 9000 Storage Controller device driver for Linux v%s.\n", TW_DRIVER_VERSION);
2208
2209         return pci_module_init(&twa_driver);
2210 } /* End twa_init() */
2211
2212 /* This function is called on driver exit */
2213 static void __exit twa_exit(void)
2214 {
2215         pci_unregister_driver(&twa_driver);
2216 } /* End twa_exit() */
2217
2218 module_init(twa_init);
2219 module_exit(twa_exit);
2220