kmsg_dump: Dump on crash_kexec as well
[linux-2.6.git] / drivers / scsi / 3w-9xxx.c
blob3bf75924741ffbce58349e3981f254011fe65b9d
1 /*
2 3w-9xxx.c -- 3ware 9000 Storage Controller device driver for Linux.
4 Written By: Adam Radford <linuxraid@amcc.com>
5 Modifications By: Tom Couch <linuxraid@amcc.com>
7 Copyright (C) 2004-2009 Applied Micro Circuits Corporation.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 NO WARRANTY
19 THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
20 CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
21 LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
22 MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
23 solely responsible for determining the appropriateness of using and
24 distributing the Program and assumes all risks associated with its
25 exercise of rights under this Agreement, including but not limited to
26 the risks and costs of program errors, damage to or loss of data,
27 programs or equipment, and unavailability or interruption of operations.
29 DISCLAIMER OF LIABILITY
30 NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
31 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32 DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
33 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
34 TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
35 USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
36 HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
38 You should have received a copy of the GNU General Public License
39 along with this program; if not, write to the Free Software
40 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
42 Bugs/Comments/Suggestions should be mailed to:
43 linuxraid@amcc.com
45 For more information, goto:
46 http://www.amcc.com
48 Note: This version of the driver does not contain a bundled firmware
49 image.
51 History
52 -------
53 2.26.02.000 - Driver cleanup for kernel submission.
54 2.26.02.001 - Replace schedule_timeout() calls with msleep().
55 2.26.02.002 - Add support for PAE mode.
56 Add lun support.
57 Fix twa_remove() to free irq handler/unregister_chrdev()
58 before shutting down card.
59 Change to new 'change_queue_depth' api.
60 Fix 'handled=1' ISR usage, remove bogus IRQ check.
61 Remove un-needed eh_abort handler.
62 Add support for embedded firmware error strings.
63 2.26.02.003 - Correctly handle single sgl's with use_sg=1.
64 2.26.02.004 - Add support for 9550SX controllers.
65 2.26.02.005 - Fix use_sg == 0 mapping on systems with 4GB or higher.
66 2.26.02.006 - Fix 9550SX pchip reset timeout.
67 Add big endian support.
68 2.26.02.007 - Disable local interrupts during kmap/unmap_atomic().
69 2.26.02.008 - Free irq handler in __twa_shutdown().
70 Serialize reset code.
71 Add support for 9650SE controllers.
72 2.26.02.009 - Fix dma mask setting to fallback to 32-bit if 64-bit fails.
73 2.26.02.010 - Add support for 9690SA controllers.
74 2.26.02.011 - Increase max AENs drained to 256.
75 Add MSI support and "use_msi" module parameter.
76 Fix bug in twa_get_param() on 4GB+.
77 Use pci_resource_len() for ioremap().
78 2.26.02.012 - Add power management support.
81 #include <linux/module.h>
82 #include <linux/reboot.h>
83 #include <linux/spinlock.h>
84 #include <linux/interrupt.h>
85 #include <linux/moduleparam.h>
86 #include <linux/errno.h>
87 #include <linux/types.h>
88 #include <linux/delay.h>
89 #include <linux/pci.h>
90 #include <linux/time.h>
91 #include <linux/mutex.h>
92 #include <linux/smp_lock.h>
93 #include <asm/io.h>
94 #include <asm/irq.h>
95 #include <asm/uaccess.h>
96 #include <scsi/scsi.h>
97 #include <scsi/scsi_host.h>
98 #include <scsi/scsi_tcq.h>
99 #include <scsi/scsi_cmnd.h>
100 #include "3w-9xxx.h"
102 /* Globals */
103 #define TW_DRIVER_VERSION "2.26.02.012"
104 static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT];
105 static unsigned int twa_device_extension_count;
106 static int twa_major = -1;
107 extern struct timezone sys_tz;
109 /* Module parameters */
110 MODULE_AUTHOR ("AMCC");
111 MODULE_DESCRIPTION ("3ware 9000 Storage Controller Linux Driver");
112 MODULE_LICENSE("GPL");
113 MODULE_VERSION(TW_DRIVER_VERSION);
115 static int use_msi = 0;
116 module_param(use_msi, int, S_IRUGO);
117 MODULE_PARM_DESC(use_msi, "Use Message Signaled Interrupts. Default: 0");
119 /* Function prototypes */
120 static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header);
121 static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id);
122 static char *twa_aen_severity_lookup(unsigned char severity_code);
123 static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id);
124 static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
125 static int twa_chrdev_open(struct inode *inode, struct file *file);
126 static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host);
127 static void twa_free_request_id(TW_Device_Extension *tw_dev,int request_id);
128 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id);
129 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
130 u32 set_features, unsigned short current_fw_srl,
131 unsigned short current_fw_arch_id,
132 unsigned short current_fw_branch,
133 unsigned short current_fw_build,
134 unsigned short *fw_on_ctlr_srl,
135 unsigned short *fw_on_ctlr_arch_id,
136 unsigned short *fw_on_ctlr_branch,
137 unsigned short *fw_on_ctlr_build,
138 u32 *init_connect_result);
139 static void twa_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full *full_command_packet, int request_id, dma_addr_t dma_handle, int length);
140 static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds);
141 static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int seconds);
142 static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, char internal);
143 static int twa_reset_device_extension(TW_Device_Extension *tw_dev);
144 static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset);
145 static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg);
146 static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id);
147 static char *twa_string_lookup(twa_message_type *table, unsigned int aen_code);
148 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id);
150 /* Functions */
152 /* Show some statistics about the card */
153 static ssize_t twa_show_stats(struct device *dev,
154 struct device_attribute *attr, char *buf)
156 struct Scsi_Host *host = class_to_shost(dev);
157 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
158 unsigned long flags = 0;
159 ssize_t len;
161 spin_lock_irqsave(tw_dev->host->host_lock, flags);
162 len = snprintf(buf, PAGE_SIZE, "3w-9xxx Driver version: %s\n"
163 "Current commands posted: %4d\n"
164 "Max commands posted: %4d\n"
165 "Current pending commands: %4d\n"
166 "Max pending commands: %4d\n"
167 "Last sgl length: %4d\n"
168 "Max sgl length: %4d\n"
169 "Last sector count: %4d\n"
170 "Max sector count: %4d\n"
171 "SCSI Host Resets: %4d\n"
172 "AEN's: %4d\n",
173 TW_DRIVER_VERSION,
174 tw_dev->posted_request_count,
175 tw_dev->max_posted_request_count,
176 tw_dev->pending_request_count,
177 tw_dev->max_pending_request_count,
178 tw_dev->sgl_entries,
179 tw_dev->max_sgl_entries,
180 tw_dev->sector_count,
181 tw_dev->max_sector_count,
182 tw_dev->num_resets,
183 tw_dev->aen_count);
184 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
185 return len;
186 } /* End twa_show_stats() */
188 /* This function will set a devices queue depth */
189 static int twa_change_queue_depth(struct scsi_device *sdev, int queue_depth,
190 int reason)
192 if (reason != SCSI_QDEPTH_DEFAULT)
193 return -EOPNOTSUPP;
195 if (queue_depth > TW_Q_LENGTH-2)
196 queue_depth = TW_Q_LENGTH-2;
197 scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, queue_depth);
198 return queue_depth;
199 } /* End twa_change_queue_depth() */
201 /* Create sysfs 'stats' entry */
202 static struct device_attribute twa_host_stats_attr = {
203 .attr = {
204 .name = "stats",
205 .mode = S_IRUGO,
207 .show = twa_show_stats
210 /* Host attributes initializer */
211 static struct device_attribute *twa_host_attrs[] = {
212 &twa_host_stats_attr,
213 NULL,
216 /* File operations struct for character device */
217 static const struct file_operations twa_fops = {
218 .owner = THIS_MODULE,
219 .ioctl = twa_chrdev_ioctl,
220 .open = twa_chrdev_open,
221 .release = NULL
224 /* This function will complete an aen request from the isr */
225 static int twa_aen_complete(TW_Device_Extension *tw_dev, int request_id)
227 TW_Command_Full *full_command_packet;
228 TW_Command *command_packet;
229 TW_Command_Apache_Header *header;
230 unsigned short aen;
231 int retval = 1;
233 header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
234 tw_dev->posted_request_count--;
235 aen = le16_to_cpu(header->status_block.error);
236 full_command_packet = tw_dev->command_packet_virt[request_id];
237 command_packet = &full_command_packet->command.oldcommand;
239 /* First check for internal completion of set param for time sync */
240 if (TW_OP_OUT(command_packet->opcode__sgloffset) == TW_OP_SET_PARAM) {
241 /* Keep reading the queue in case there are more aen's */
242 if (twa_aen_read_queue(tw_dev, request_id))
243 goto out2;
244 else {
245 retval = 0;
246 goto out;
250 switch (aen) {
251 case TW_AEN_QUEUE_EMPTY:
252 /* Quit reading the queue if this is the last one */
253 break;
254 case TW_AEN_SYNC_TIME_WITH_HOST:
255 twa_aen_sync_time(tw_dev, request_id);
256 retval = 0;
257 goto out;
258 default:
259 twa_aen_queue_event(tw_dev, header);
261 /* If there are more aen's, keep reading the queue */
262 if (twa_aen_read_queue(tw_dev, request_id))
263 goto out2;
264 else {
265 retval = 0;
266 goto out;
269 retval = 0;
270 out2:
271 tw_dev->state[request_id] = TW_S_COMPLETED;
272 twa_free_request_id(tw_dev, request_id);
273 clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
274 out:
275 return retval;
276 } /* End twa_aen_complete() */
278 /* This function will drain aen queue */
279 static int twa_aen_drain_queue(TW_Device_Extension *tw_dev, int no_check_reset)
281 int request_id = 0;
282 char cdb[TW_MAX_CDB_LEN];
283 TW_SG_Entry sglist[1];
284 int finished = 0, count = 0;
285 TW_Command_Full *full_command_packet;
286 TW_Command_Apache_Header *header;
287 unsigned short aen;
288 int first_reset = 0, queue = 0, retval = 1;
290 if (no_check_reset)
291 first_reset = 0;
292 else
293 first_reset = 1;
295 full_command_packet = tw_dev->command_packet_virt[request_id];
296 memset(full_command_packet, 0, sizeof(TW_Command_Full));
298 /* Initialize cdb */
299 memset(&cdb, 0, TW_MAX_CDB_LEN);
300 cdb[0] = REQUEST_SENSE; /* opcode */
301 cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
303 /* Initialize sglist */
304 memset(&sglist, 0, sizeof(TW_SG_Entry));
305 sglist[0].length = TW_SECTOR_SIZE;
306 sglist[0].address = tw_dev->generic_buffer_phys[request_id];
308 if (sglist[0].address & TW_ALIGNMENT_9000_SGL) {
309 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Found unaligned address during AEN drain");
310 goto out;
313 /* Mark internal command */
314 tw_dev->srb[request_id] = NULL;
316 do {
317 /* Send command to the board */
318 if (twa_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
319 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2, "Error posting request sense");
320 goto out;
323 /* Now poll for completion */
324 if (twa_poll_response(tw_dev, request_id, 30)) {
325 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x3, "No valid response while draining AEN queue");
326 tw_dev->posted_request_count--;
327 goto out;
330 tw_dev->posted_request_count--;
331 header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
332 aen = le16_to_cpu(header->status_block.error);
333 queue = 0;
334 count++;
336 switch (aen) {
337 case TW_AEN_QUEUE_EMPTY:
338 if (first_reset != 1)
339 goto out;
340 else
341 finished = 1;
342 break;
343 case TW_AEN_SOFT_RESET:
344 if (first_reset == 0)
345 first_reset = 1;
346 else
347 queue = 1;
348 break;
349 case TW_AEN_SYNC_TIME_WITH_HOST:
350 break;
351 default:
352 queue = 1;
355 /* Now queue an event info */
356 if (queue)
357 twa_aen_queue_event(tw_dev, header);
358 } while ((finished == 0) && (count < TW_MAX_AEN_DRAIN));
360 if (count == TW_MAX_AEN_DRAIN)
361 goto out;
363 retval = 0;
364 out:
365 tw_dev->state[request_id] = TW_S_INITIAL;
366 return retval;
367 } /* End twa_aen_drain_queue() */
369 /* This function will queue an event */
370 static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header)
372 u32 local_time;
373 struct timeval time;
374 TW_Event *event;
375 unsigned short aen;
376 char host[16];
377 char *error_str;
379 tw_dev->aen_count++;
381 /* Fill out event info */
382 event = tw_dev->event_queue[tw_dev->error_index];
384 /* Check for clobber */
385 host[0] = '\0';
386 if (tw_dev->host) {
387 sprintf(host, " scsi%d:", tw_dev->host->host_no);
388 if (event->retrieved == TW_AEN_NOT_RETRIEVED)
389 tw_dev->aen_clobber = 1;
392 aen = le16_to_cpu(header->status_block.error);
393 memset(event, 0, sizeof(TW_Event));
395 event->severity = TW_SEV_OUT(header->status_block.severity__reserved);
396 do_gettimeofday(&time);
397 local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60));
398 event->time_stamp_sec = local_time;
399 event->aen_code = aen;
400 event->retrieved = TW_AEN_NOT_RETRIEVED;
401 event->sequence_id = tw_dev->error_sequence_id;
402 tw_dev->error_sequence_id++;
404 /* Check for embedded error string */
405 error_str = &(header->err_specific_desc[strlen(header->err_specific_desc)+1]);
407 header->err_specific_desc[sizeof(header->err_specific_desc) - 1] = '\0';
408 event->parameter_len = strlen(header->err_specific_desc);
409 memcpy(event->parameter_data, header->err_specific_desc, event->parameter_len + (error_str[0] == '\0' ? 0 : (1 + strlen(error_str))));
410 if (event->severity != TW_AEN_SEVERITY_DEBUG)
411 printk(KERN_WARNING "3w-9xxx:%s AEN: %s (0x%02X:0x%04X): %s:%s.\n",
412 host,
413 twa_aen_severity_lookup(TW_SEV_OUT(header->status_block.severity__reserved)),
414 TW_MESSAGE_SOURCE_CONTROLLER_EVENT, aen,
415 error_str[0] == '\0' ? twa_string_lookup(twa_aen_table, aen) : error_str,
416 header->err_specific_desc);
417 else
418 tw_dev->aen_count--;
420 if ((tw_dev->error_index + 1) == TW_Q_LENGTH)
421 tw_dev->event_queue_wrapped = 1;
422 tw_dev->error_index = (tw_dev->error_index + 1 ) % TW_Q_LENGTH;
423 } /* End twa_aen_queue_event() */
425 /* This function will read the aen queue from the isr */
426 static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id)
428 char cdb[TW_MAX_CDB_LEN];
429 TW_SG_Entry sglist[1];
430 TW_Command_Full *full_command_packet;
431 int retval = 1;
433 full_command_packet = tw_dev->command_packet_virt[request_id];
434 memset(full_command_packet, 0, sizeof(TW_Command_Full));
436 /* Initialize cdb */
437 memset(&cdb, 0, TW_MAX_CDB_LEN);
438 cdb[0] = REQUEST_SENSE; /* opcode */
439 cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
441 /* Initialize sglist */
442 memset(&sglist, 0, sizeof(TW_SG_Entry));
443 sglist[0].length = TW_SECTOR_SIZE;
444 sglist[0].address = tw_dev->generic_buffer_phys[request_id];
446 /* Mark internal command */
447 tw_dev->srb[request_id] = NULL;
449 /* Now post the command packet */
450 if (twa_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
451 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x4, "Post failed while reading AEN queue");
452 goto out;
454 retval = 0;
455 out:
456 return retval;
457 } /* End twa_aen_read_queue() */
459 /* This function will look up an AEN severity string */
460 static char *twa_aen_severity_lookup(unsigned char severity_code)
462 char *retval = NULL;
464 if ((severity_code < (unsigned char) TW_AEN_SEVERITY_ERROR) ||
465 (severity_code > (unsigned char) TW_AEN_SEVERITY_DEBUG))
466 goto out;
468 retval = twa_aen_severity_table[severity_code];
469 out:
470 return retval;
471 } /* End twa_aen_severity_lookup() */
473 /* This function will sync firmware time with the host time */
474 static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id)
476 u32 schedulertime;
477 struct timeval utc;
478 TW_Command_Full *full_command_packet;
479 TW_Command *command_packet;
480 TW_Param_Apache *param;
481 u32 local_time;
483 /* Fill out the command packet */
484 full_command_packet = tw_dev->command_packet_virt[request_id];
485 memset(full_command_packet, 0, sizeof(TW_Command_Full));
486 command_packet = &full_command_packet->command.oldcommand;
487 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_SET_PARAM);
488 command_packet->request_id = request_id;
489 command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
490 command_packet->byte8_offset.param.sgl[0].length = cpu_to_le32(TW_SECTOR_SIZE);
491 command_packet->size = TW_COMMAND_SIZE;
492 command_packet->byte6_offset.parameter_count = cpu_to_le16(1);
494 /* Setup the param */
495 param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
496 memset(param, 0, TW_SECTOR_SIZE);
497 param->table_id = cpu_to_le16(TW_TIMEKEEP_TABLE | 0x8000); /* Controller time keep table */
498 param->parameter_id = cpu_to_le16(0x3); /* SchedulerTime */
499 param->parameter_size_bytes = cpu_to_le16(4);
501 /* Convert system time in UTC to local time seconds since last
502 Sunday 12:00AM */
503 do_gettimeofday(&utc);
504 local_time = (u32)(utc.tv_sec - (sys_tz.tz_minuteswest * 60));
505 schedulertime = local_time - (3 * 86400);
506 schedulertime = cpu_to_le32(schedulertime % 604800);
508 memcpy(param->data, &schedulertime, sizeof(u32));
510 /* Mark internal command */
511 tw_dev->srb[request_id] = NULL;
513 /* Now post the command */
514 twa_post_command_packet(tw_dev, request_id, 1);
515 } /* End twa_aen_sync_time() */
517 /* This function will allocate memory and check if it is correctly aligned */
518 static int twa_allocate_memory(TW_Device_Extension *tw_dev, int size, int which)
520 int i;
521 dma_addr_t dma_handle;
522 unsigned long *cpu_addr;
523 int retval = 1;
525 cpu_addr = pci_alloc_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, &dma_handle);
526 if (!cpu_addr) {
527 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x5, "Memory allocation failed");
528 goto out;
531 if ((unsigned long)cpu_addr % (TW_ALIGNMENT_9000)) {
532 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x6, "Failed to allocate correctly aligned memory");
533 pci_free_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, cpu_addr, dma_handle);
534 goto out;
537 memset(cpu_addr, 0, size*TW_Q_LENGTH);
539 for (i = 0; i < TW_Q_LENGTH; i++) {
540 switch(which) {
541 case 0:
542 tw_dev->command_packet_phys[i] = dma_handle+(i*size);
543 tw_dev->command_packet_virt[i] = (TW_Command_Full *)((unsigned char *)cpu_addr + (i*size));
544 break;
545 case 1:
546 tw_dev->generic_buffer_phys[i] = dma_handle+(i*size);
547 tw_dev->generic_buffer_virt[i] = (unsigned long *)((unsigned char *)cpu_addr + (i*size));
548 break;
551 retval = 0;
552 out:
553 return retval;
554 } /* End twa_allocate_memory() */
556 /* This function will check the status register for unexpected bits */
557 static int twa_check_bits(u32 status_reg_value)
559 int retval = 1;
561 if ((status_reg_value & TW_STATUS_EXPECTED_BITS) != TW_STATUS_EXPECTED_BITS)
562 goto out;
563 if ((status_reg_value & TW_STATUS_UNEXPECTED_BITS) != 0)
564 goto out;
566 retval = 0;
567 out:
568 return retval;
569 } /* End twa_check_bits() */
571 /* This function will check the srl and decide if we are compatible */
572 static int twa_check_srl(TW_Device_Extension *tw_dev, int *flashed)
574 int retval = 1;
575 unsigned short fw_on_ctlr_srl = 0, fw_on_ctlr_arch_id = 0;
576 unsigned short fw_on_ctlr_branch = 0, fw_on_ctlr_build = 0;
577 u32 init_connect_result = 0;
579 if (twa_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
580 TW_EXTENDED_INIT_CONNECT, TW_CURRENT_DRIVER_SRL,
581 TW_9000_ARCH_ID, TW_CURRENT_DRIVER_BRANCH,
582 TW_CURRENT_DRIVER_BUILD, &fw_on_ctlr_srl,
583 &fw_on_ctlr_arch_id, &fw_on_ctlr_branch,
584 &fw_on_ctlr_build, &init_connect_result)) {
585 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x7, "Initconnection failed while checking SRL");
586 goto out;
589 tw_dev->tw_compat_info.working_srl = fw_on_ctlr_srl;
590 tw_dev->tw_compat_info.working_branch = fw_on_ctlr_branch;
591 tw_dev->tw_compat_info.working_build = fw_on_ctlr_build;
593 /* Try base mode compatibility */
594 if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
595 if (twa_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
596 TW_EXTENDED_INIT_CONNECT,
597 TW_BASE_FW_SRL, TW_9000_ARCH_ID,
598 TW_BASE_FW_BRANCH, TW_BASE_FW_BUILD,
599 &fw_on_ctlr_srl, &fw_on_ctlr_arch_id,
600 &fw_on_ctlr_branch, &fw_on_ctlr_build,
601 &init_connect_result)) {
602 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xa, "Initconnection (base mode) failed while checking SRL");
603 goto out;
605 if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
606 if (TW_CURRENT_DRIVER_SRL > fw_on_ctlr_srl) {
607 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x32, "Firmware and driver incompatibility: please upgrade firmware");
608 } else {
609 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x33, "Firmware and driver incompatibility: please upgrade driver");
611 goto out;
613 tw_dev->tw_compat_info.working_srl = TW_BASE_FW_SRL;
614 tw_dev->tw_compat_info.working_branch = TW_BASE_FW_BRANCH;
615 tw_dev->tw_compat_info.working_build = TW_BASE_FW_BUILD;
618 /* Load rest of compatibility struct */
619 strncpy(tw_dev->tw_compat_info.driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION));
620 tw_dev->tw_compat_info.driver_srl_high = TW_CURRENT_DRIVER_SRL;
621 tw_dev->tw_compat_info.driver_branch_high = TW_CURRENT_DRIVER_BRANCH;
622 tw_dev->tw_compat_info.driver_build_high = TW_CURRENT_DRIVER_BUILD;
623 tw_dev->tw_compat_info.driver_srl_low = TW_BASE_FW_SRL;
624 tw_dev->tw_compat_info.driver_branch_low = TW_BASE_FW_BRANCH;
625 tw_dev->tw_compat_info.driver_build_low = TW_BASE_FW_BUILD;
626 tw_dev->tw_compat_info.fw_on_ctlr_srl = fw_on_ctlr_srl;
627 tw_dev->tw_compat_info.fw_on_ctlr_branch = fw_on_ctlr_branch;
628 tw_dev->tw_compat_info.fw_on_ctlr_build = fw_on_ctlr_build;
630 retval = 0;
631 out:
632 return retval;
633 } /* End twa_check_srl() */
635 /* This function handles ioctl for the character device */
636 static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
638 long timeout;
639 unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0;
640 dma_addr_t dma_handle;
641 int request_id = 0;
642 unsigned int sequence_id = 0;
643 unsigned char event_index, start_index;
644 TW_Ioctl_Driver_Command driver_command;
645 TW_Ioctl_Buf_Apache *tw_ioctl;
646 TW_Lock *tw_lock;
647 TW_Command_Full *full_command_packet;
648 TW_Compatibility_Info *tw_compat_info;
649 TW_Event *event;
650 struct timeval current_time;
651 u32 current_time_ms;
652 TW_Device_Extension *tw_dev = twa_device_extension_list[iminor(inode)];
653 int retval = TW_IOCTL_ERROR_OS_EFAULT;
654 void __user *argp = (void __user *)arg;
656 /* Only let one of these through at a time */
657 if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) {
658 retval = TW_IOCTL_ERROR_OS_EINTR;
659 goto out;
662 /* First copy down the driver command */
663 if (copy_from_user(&driver_command, argp, sizeof(TW_Ioctl_Driver_Command)))
664 goto out2;
666 /* Check data buffer size */
667 if (driver_command.buffer_length > TW_MAX_SECTORS * 2048) {
668 retval = TW_IOCTL_ERROR_OS_EINVAL;
669 goto out2;
672 /* Hardware can only do multiple of 512 byte transfers */
673 data_buffer_length_adjusted = (driver_command.buffer_length + 511) & ~511;
675 /* Now allocate ioctl buf memory */
676 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);
677 if (!cpu_addr) {
678 retval = TW_IOCTL_ERROR_OS_ENOMEM;
679 goto out2;
682 tw_ioctl = (TW_Ioctl_Buf_Apache *)cpu_addr;
684 /* Now copy down the entire ioctl */
685 if (copy_from_user(tw_ioctl, argp, driver_command.buffer_length + sizeof(TW_Ioctl_Buf_Apache) - 1))
686 goto out3;
688 /* See which ioctl we are doing */
689 switch (cmd) {
690 case TW_IOCTL_FIRMWARE_PASS_THROUGH:
691 spin_lock_irqsave(tw_dev->host->host_lock, flags);
692 twa_get_request_id(tw_dev, &request_id);
694 /* Flag internal command */
695 tw_dev->srb[request_id] = NULL;
697 /* Flag chrdev ioctl */
698 tw_dev->chrdev_request_id = request_id;
700 full_command_packet = &tw_ioctl->firmware_command;
702 /* Load request id and sglist for both command types */
703 twa_load_sgl(tw_dev, full_command_packet, request_id, dma_handle, data_buffer_length_adjusted);
705 memcpy(tw_dev->command_packet_virt[request_id], &(tw_ioctl->firmware_command), sizeof(TW_Command_Full));
707 /* Now post the command packet to the controller */
708 twa_post_command_packet(tw_dev, request_id, 1);
709 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
711 timeout = TW_IOCTL_CHRDEV_TIMEOUT*HZ;
713 /* Now wait for command to complete */
714 timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout);
716 /* We timed out, and didn't get an interrupt */
717 if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) {
718 /* Now we need to reset the board */
719 printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Character ioctl (0x%x) timed out, resetting card.\n",
720 tw_dev->host->host_no, TW_DRIVER, 0x37,
721 cmd);
722 retval = TW_IOCTL_ERROR_OS_EIO;
723 twa_reset_device_extension(tw_dev);
724 goto out3;
727 /* Now copy in the command packet response */
728 memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virt[request_id], sizeof(TW_Command_Full));
730 /* Now complete the io */
731 spin_lock_irqsave(tw_dev->host->host_lock, flags);
732 tw_dev->posted_request_count--;
733 tw_dev->state[request_id] = TW_S_COMPLETED;
734 twa_free_request_id(tw_dev, request_id);
735 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
736 break;
737 case TW_IOCTL_GET_COMPATIBILITY_INFO:
738 tw_ioctl->driver_command.status = 0;
739 /* Copy compatibility struct into ioctl data buffer */
740 tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer;
741 memcpy(tw_compat_info, &tw_dev->tw_compat_info, sizeof(TW_Compatibility_Info));
742 break;
743 case TW_IOCTL_GET_LAST_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 } else {
751 if (!tw_dev->error_index) {
752 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
753 break;
755 tw_ioctl->driver_command.status = 0;
757 event_index = (tw_dev->error_index - 1 + TW_Q_LENGTH) % TW_Q_LENGTH;
758 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
759 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
760 break;
761 case TW_IOCTL_GET_FIRST_EVENT:
762 if (tw_dev->event_queue_wrapped) {
763 if (tw_dev->aen_clobber) {
764 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
765 tw_dev->aen_clobber = 0;
766 } else
767 tw_ioctl->driver_command.status = 0;
768 event_index = tw_dev->error_index;
769 } else {
770 if (!tw_dev->error_index) {
771 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
772 break;
774 tw_ioctl->driver_command.status = 0;
775 event_index = 0;
777 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
778 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
779 break;
780 case TW_IOCTL_GET_NEXT_EVENT:
781 event = (TW_Event *)tw_ioctl->data_buffer;
782 sequence_id = event->sequence_id;
783 tw_ioctl->driver_command.status = 0;
785 if (tw_dev->event_queue_wrapped) {
786 if (tw_dev->aen_clobber) {
787 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
788 tw_dev->aen_clobber = 0;
790 start_index = tw_dev->error_index;
791 } else {
792 if (!tw_dev->error_index) {
793 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
794 break;
796 start_index = 0;
798 event_index = (start_index + sequence_id - tw_dev->event_queue[start_index]->sequence_id + 1) % TW_Q_LENGTH;
800 if (!(tw_dev->event_queue[event_index]->sequence_id > sequence_id)) {
801 if (tw_ioctl->driver_command.status == TW_IOCTL_ERROR_STATUS_AEN_CLOBBER)
802 tw_dev->aen_clobber = 1;
803 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
804 break;
806 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
807 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
808 break;
809 case TW_IOCTL_GET_PREVIOUS_EVENT:
810 event = (TW_Event *)tw_ioctl->data_buffer;
811 sequence_id = event->sequence_id;
812 tw_ioctl->driver_command.status = 0;
814 if (tw_dev->event_queue_wrapped) {
815 if (tw_dev->aen_clobber) {
816 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
817 tw_dev->aen_clobber = 0;
819 start_index = tw_dev->error_index;
820 } else {
821 if (!tw_dev->error_index) {
822 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
823 break;
825 start_index = 0;
827 event_index = (start_index + sequence_id - tw_dev->event_queue[start_index]->sequence_id - 1) % TW_Q_LENGTH;
829 if (!(tw_dev->event_queue[event_index]->sequence_id < sequence_id)) {
830 if (tw_ioctl->driver_command.status == TW_IOCTL_ERROR_STATUS_AEN_CLOBBER)
831 tw_dev->aen_clobber = 1;
832 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
833 break;
835 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
836 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
837 break;
838 case TW_IOCTL_GET_LOCK:
839 tw_lock = (TW_Lock *)tw_ioctl->data_buffer;
840 do_gettimeofday(&current_time);
841 current_time_ms = (current_time.tv_sec * 1000) + (current_time.tv_usec / 1000);
843 if ((tw_lock->force_flag == 1) || (tw_dev->ioctl_sem_lock == 0) || (current_time_ms >= tw_dev->ioctl_msec)) {
844 tw_dev->ioctl_sem_lock = 1;
845 tw_dev->ioctl_msec = current_time_ms + tw_lock->timeout_msec;
846 tw_ioctl->driver_command.status = 0;
847 tw_lock->time_remaining_msec = tw_lock->timeout_msec;
848 } else {
849 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_LOCKED;
850 tw_lock->time_remaining_msec = tw_dev->ioctl_msec - current_time_ms;
852 break;
853 case TW_IOCTL_RELEASE_LOCK:
854 if (tw_dev->ioctl_sem_lock == 1) {
855 tw_dev->ioctl_sem_lock = 0;
856 tw_ioctl->driver_command.status = 0;
857 } else {
858 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NOT_LOCKED;
860 break;
861 default:
862 retval = TW_IOCTL_ERROR_OS_ENOTTY;
863 goto out3;
866 /* Now copy the entire response to userspace */
867 if (copy_to_user(argp, tw_ioctl, sizeof(TW_Ioctl_Buf_Apache) + driver_command.buffer_length - 1) == 0)
868 retval = 0;
869 out3:
870 /* Now free ioctl buf memory */
871 dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, cpu_addr, dma_handle);
872 out2:
873 mutex_unlock(&tw_dev->ioctl_lock);
874 out:
875 return retval;
876 } /* End twa_chrdev_ioctl() */
878 /* This function handles open for the character device */
879 /* NOTE that this function will race with remove. */
880 static int twa_chrdev_open(struct inode *inode, struct file *file)
882 unsigned int minor_number;
883 int retval = TW_IOCTL_ERROR_OS_ENODEV;
885 cycle_kernel_lock();
886 minor_number = iminor(inode);
887 if (minor_number >= twa_device_extension_count)
888 goto out;
889 retval = 0;
890 out:
891 return retval;
892 } /* End twa_chrdev_open() */
894 /* This function will print readable messages from status register errors */
895 static int twa_decode_bits(TW_Device_Extension *tw_dev, u32 status_reg_value)
897 int retval = 1;
899 /* Check for various error conditions and handle them appropriately */
900 if (status_reg_value & TW_STATUS_PCI_PARITY_ERROR) {
901 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xc, "PCI Parity Error: clearing");
902 writel(TW_CONTROL_CLEAR_PARITY_ERROR, TW_CONTROL_REG_ADDR(tw_dev));
905 if (status_reg_value & TW_STATUS_PCI_ABORT) {
906 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xd, "PCI Abort: clearing");
907 writel(TW_CONTROL_CLEAR_PCI_ABORT, TW_CONTROL_REG_ADDR(tw_dev));
908 pci_write_config_word(tw_dev->tw_pci_dev, PCI_STATUS, TW_PCI_CLEAR_PCI_ABORT);
911 if (status_reg_value & TW_STATUS_QUEUE_ERROR) {
912 if (((tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9650SE) &&
913 (tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9690SA)) ||
914 (!test_bit(TW_IN_RESET, &tw_dev->flags)))
915 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing");
916 writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev));
919 if (status_reg_value & TW_STATUS_MICROCONTROLLER_ERROR) {
920 if (tw_dev->reset_print == 0) {
921 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x10, "Microcontroller Error: clearing");
922 tw_dev->reset_print = 1;
924 goto out;
926 retval = 0;
927 out:
928 return retval;
929 } /* End twa_decode_bits() */
931 /* This function will empty the response queue */
932 static int twa_empty_response_queue(TW_Device_Extension *tw_dev)
934 u32 status_reg_value, response_que_value;
935 int count = 0, retval = 1;
937 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
939 while (((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) && (count < TW_MAX_RESPONSE_DRAIN)) {
940 response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
941 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
942 count++;
944 if (count == TW_MAX_RESPONSE_DRAIN)
945 goto out;
947 retval = 0;
948 out:
949 return retval;
950 } /* End twa_empty_response_queue() */
952 /* This function will clear the pchip/response queue on 9550SX */
953 static int twa_empty_response_queue_large(TW_Device_Extension *tw_dev)
955 u32 response_que_value = 0;
956 unsigned long before;
957 int retval = 1;
959 if (tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9000) {
960 before = jiffies;
961 while ((response_que_value & TW_9550SX_DRAIN_COMPLETED) != TW_9550SX_DRAIN_COMPLETED) {
962 response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev));
963 msleep(1);
964 if (time_after(jiffies, before + HZ * 30))
965 goto out;
967 /* P-chip settle time */
968 msleep(500);
969 retval = 0;
970 } else
971 retval = 0;
972 out:
973 return retval;
974 } /* End twa_empty_response_queue_large() */
976 /* This function passes sense keys from firmware to scsi layer */
977 static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host)
979 TW_Command_Full *full_command_packet;
980 unsigned short error;
981 int retval = 1;
982 char *error_str;
984 full_command_packet = tw_dev->command_packet_virt[request_id];
986 /* Check for embedded error string */
987 error_str = &(full_command_packet->header.err_specific_desc[strlen(full_command_packet->header.err_specific_desc) + 1]);
989 /* Don't print error for Logical unit not supported during rollcall */
990 error = le16_to_cpu(full_command_packet->header.status_block.error);
991 if ((error != TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED) && (error != TW_ERROR_UNIT_OFFLINE)) {
992 if (print_host)
993 printk(KERN_WARNING "3w-9xxx: scsi%d: ERROR: (0x%02X:0x%04X): %s:%s.\n",
994 tw_dev->host->host_no,
995 TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
996 full_command_packet->header.status_block.error,
997 error_str[0] == '\0' ?
998 twa_string_lookup(twa_error_table,
999 full_command_packet->header.status_block.error) : error_str,
1000 full_command_packet->header.err_specific_desc);
1001 else
1002 printk(KERN_WARNING "3w-9xxx: ERROR: (0x%02X:0x%04X): %s:%s.\n",
1003 TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
1004 full_command_packet->header.status_block.error,
1005 error_str[0] == '\0' ?
1006 twa_string_lookup(twa_error_table,
1007 full_command_packet->header.status_block.error) : error_str,
1008 full_command_packet->header.err_specific_desc);
1011 if (copy_sense) {
1012 memcpy(tw_dev->srb[request_id]->sense_buffer, full_command_packet->header.sense_data, TW_SENSE_DATA_LENGTH);
1013 tw_dev->srb[request_id]->result = (full_command_packet->command.newcommand.status << 1);
1014 retval = TW_ISR_DONT_RESULT;
1015 goto out;
1017 retval = 0;
1018 out:
1019 return retval;
1020 } /* End twa_fill_sense() */
1022 /* This function will free up device extension resources */
1023 static void twa_free_device_extension(TW_Device_Extension *tw_dev)
1025 if (tw_dev->command_packet_virt[0])
1026 pci_free_consistent(tw_dev->tw_pci_dev,
1027 sizeof(TW_Command_Full)*TW_Q_LENGTH,
1028 tw_dev->command_packet_virt[0],
1029 tw_dev->command_packet_phys[0]);
1031 if (tw_dev->generic_buffer_virt[0])
1032 pci_free_consistent(tw_dev->tw_pci_dev,
1033 TW_SECTOR_SIZE*TW_Q_LENGTH,
1034 tw_dev->generic_buffer_virt[0],
1035 tw_dev->generic_buffer_phys[0]);
1037 kfree(tw_dev->event_queue[0]);
1038 } /* End twa_free_device_extension() */
1040 /* This function will free a request id */
1041 static void twa_free_request_id(TW_Device_Extension *tw_dev, int request_id)
1043 tw_dev->free_queue[tw_dev->free_tail] = request_id;
1044 tw_dev->state[request_id] = TW_S_FINISHED;
1045 tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH;
1046 } /* End twa_free_request_id() */
1048 /* This function will get parameter table entries from the firmware */
1049 static void *twa_get_param(TW_Device_Extension *tw_dev, int request_id, int table_id, int parameter_id, int parameter_size_bytes)
1051 TW_Command_Full *full_command_packet;
1052 TW_Command *command_packet;
1053 TW_Param_Apache *param;
1054 void *retval = NULL;
1056 /* Setup the command packet */
1057 full_command_packet = tw_dev->command_packet_virt[request_id];
1058 memset(full_command_packet, 0, sizeof(TW_Command_Full));
1059 command_packet = &full_command_packet->command.oldcommand;
1061 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM);
1062 command_packet->size = TW_COMMAND_SIZE;
1063 command_packet->request_id = request_id;
1064 command_packet->byte6_offset.block_count = cpu_to_le16(1);
1066 /* Now setup the param */
1067 param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
1068 memset(param, 0, TW_SECTOR_SIZE);
1069 param->table_id = cpu_to_le16(table_id | 0x8000);
1070 param->parameter_id = cpu_to_le16(parameter_id);
1071 param->parameter_size_bytes = cpu_to_le16(parameter_size_bytes);
1073 command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
1074 command_packet->byte8_offset.param.sgl[0].length = cpu_to_le32(TW_SECTOR_SIZE);
1076 /* Post the command packet to the board */
1077 twa_post_command_packet(tw_dev, request_id, 1);
1079 /* Poll for completion */
1080 if (twa_poll_response(tw_dev, request_id, 30))
1081 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x13, "No valid response during get param")
1082 else
1083 retval = (void *)&(param->data[0]);
1085 tw_dev->posted_request_count--;
1086 tw_dev->state[request_id] = TW_S_INITIAL;
1088 return retval;
1089 } /* End twa_get_param() */
1091 /* This function will assign an available request id */
1092 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id)
1094 *request_id = tw_dev->free_queue[tw_dev->free_head];
1095 tw_dev->free_head = (tw_dev->free_head + 1) % TW_Q_LENGTH;
1096 tw_dev->state[*request_id] = TW_S_STARTED;
1097 } /* End twa_get_request_id() */
1099 /* This function will send an initconnection command to controller */
1100 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
1101 u32 set_features, unsigned short current_fw_srl,
1102 unsigned short current_fw_arch_id,
1103 unsigned short current_fw_branch,
1104 unsigned short current_fw_build,
1105 unsigned short *fw_on_ctlr_srl,
1106 unsigned short *fw_on_ctlr_arch_id,
1107 unsigned short *fw_on_ctlr_branch,
1108 unsigned short *fw_on_ctlr_build,
1109 u32 *init_connect_result)
1111 TW_Command_Full *full_command_packet;
1112 TW_Initconnect *tw_initconnect;
1113 int request_id = 0, retval = 1;
1115 /* Initialize InitConnection command packet */
1116 full_command_packet = tw_dev->command_packet_virt[request_id];
1117 memset(full_command_packet, 0, sizeof(TW_Command_Full));
1118 full_command_packet->header.header_desc.size_header = 128;
1120 tw_initconnect = (TW_Initconnect *)&full_command_packet->command.oldcommand;
1121 tw_initconnect->opcode__reserved = TW_OPRES_IN(0, TW_OP_INIT_CONNECTION);
1122 tw_initconnect->request_id = request_id;
1123 tw_initconnect->message_credits = cpu_to_le16(message_credits);
1124 tw_initconnect->features = set_features;
1126 /* Turn on 64-bit sgl support if we need to */
1127 tw_initconnect->features |= sizeof(dma_addr_t) > 4 ? 1 : 0;
1129 tw_initconnect->features = cpu_to_le32(tw_initconnect->features);
1131 if (set_features & TW_EXTENDED_INIT_CONNECT) {
1132 tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE_EXTENDED;
1133 tw_initconnect->fw_srl = cpu_to_le16(current_fw_srl);
1134 tw_initconnect->fw_arch_id = cpu_to_le16(current_fw_arch_id);
1135 tw_initconnect->fw_branch = cpu_to_le16(current_fw_branch);
1136 tw_initconnect->fw_build = cpu_to_le16(current_fw_build);
1137 } else
1138 tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE;
1140 /* Send command packet to the board */
1141 twa_post_command_packet(tw_dev, request_id, 1);
1143 /* Poll for completion */
1144 if (twa_poll_response(tw_dev, request_id, 30)) {
1145 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x15, "No valid response during init connection");
1146 } else {
1147 if (set_features & TW_EXTENDED_INIT_CONNECT) {
1148 *fw_on_ctlr_srl = le16_to_cpu(tw_initconnect->fw_srl);
1149 *fw_on_ctlr_arch_id = le16_to_cpu(tw_initconnect->fw_arch_id);
1150 *fw_on_ctlr_branch = le16_to_cpu(tw_initconnect->fw_branch);
1151 *fw_on_ctlr_build = le16_to_cpu(tw_initconnect->fw_build);
1152 *init_connect_result = le32_to_cpu(tw_initconnect->result);
1154 retval = 0;
1157 tw_dev->posted_request_count--;
1158 tw_dev->state[request_id] = TW_S_INITIAL;
1160 return retval;
1161 } /* End twa_initconnection() */
1163 /* This function will initialize the fields of a device extension */
1164 static int twa_initialize_device_extension(TW_Device_Extension *tw_dev)
1166 int i, retval = 1;
1168 /* Initialize command packet buffers */
1169 if (twa_allocate_memory(tw_dev, sizeof(TW_Command_Full), 0)) {
1170 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x16, "Command packet memory allocation failed");
1171 goto out;
1174 /* Initialize generic buffer */
1175 if (twa_allocate_memory(tw_dev, TW_SECTOR_SIZE, 1)) {
1176 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x17, "Generic memory allocation failed");
1177 goto out;
1180 /* Allocate event info space */
1181 tw_dev->event_queue[0] = kcalloc(TW_Q_LENGTH, sizeof(TW_Event), GFP_KERNEL);
1182 if (!tw_dev->event_queue[0]) {
1183 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x18, "Event info memory allocation failed");
1184 goto out;
1188 for (i = 0; i < TW_Q_LENGTH; i++) {
1189 tw_dev->event_queue[i] = (TW_Event *)((unsigned char *)tw_dev->event_queue[0] + (i * sizeof(TW_Event)));
1190 tw_dev->free_queue[i] = i;
1191 tw_dev->state[i] = TW_S_INITIAL;
1194 tw_dev->pending_head = TW_Q_START;
1195 tw_dev->pending_tail = TW_Q_START;
1196 tw_dev->free_head = TW_Q_START;
1197 tw_dev->free_tail = TW_Q_START;
1198 tw_dev->error_sequence_id = 1;
1199 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1201 mutex_init(&tw_dev->ioctl_lock);
1202 init_waitqueue_head(&tw_dev->ioctl_wqueue);
1204 retval = 0;
1205 out:
1206 return retval;
1207 } /* End twa_initialize_device_extension() */
1209 /* This function is the interrupt service routine */
1210 static irqreturn_t twa_interrupt(int irq, void *dev_instance)
1212 int request_id, error = 0;
1213 u32 status_reg_value;
1214 TW_Response_Queue response_que;
1215 TW_Command_Full *full_command_packet;
1216 TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance;
1217 int handled = 0;
1219 /* Get the per adapter lock */
1220 spin_lock(tw_dev->host->host_lock);
1222 /* Read the registers */
1223 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1225 /* Check if this is our interrupt, otherwise bail */
1226 if (!(status_reg_value & TW_STATUS_VALID_INTERRUPT))
1227 goto twa_interrupt_bail;
1229 handled = 1;
1231 /* If we are resetting, bail */
1232 if (test_bit(TW_IN_RESET, &tw_dev->flags))
1233 goto twa_interrupt_bail;
1235 /* Check controller for errors */
1236 if (twa_check_bits(status_reg_value)) {
1237 if (twa_decode_bits(tw_dev, status_reg_value)) {
1238 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1239 goto twa_interrupt_bail;
1243 /* Handle host interrupt */
1244 if (status_reg_value & TW_STATUS_HOST_INTERRUPT)
1245 TW_CLEAR_HOST_INTERRUPT(tw_dev);
1247 /* Handle attention interrupt */
1248 if (status_reg_value & TW_STATUS_ATTENTION_INTERRUPT) {
1249 TW_CLEAR_ATTENTION_INTERRUPT(tw_dev);
1250 if (!(test_and_set_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags))) {
1251 twa_get_request_id(tw_dev, &request_id);
1253 error = twa_aen_read_queue(tw_dev, request_id);
1254 if (error) {
1255 tw_dev->state[request_id] = TW_S_COMPLETED;
1256 twa_free_request_id(tw_dev, request_id);
1257 clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
1262 /* Handle command interrupt */
1263 if (status_reg_value & TW_STATUS_COMMAND_INTERRUPT) {
1264 TW_MASK_COMMAND_INTERRUPT(tw_dev);
1265 /* Drain as many pending commands as we can */
1266 while (tw_dev->pending_request_count > 0) {
1267 request_id = tw_dev->pending_queue[tw_dev->pending_head];
1268 if (tw_dev->state[request_id] != TW_S_PENDING) {
1269 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x19, "Found request id that wasn't pending");
1270 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1271 goto twa_interrupt_bail;
1273 if (twa_post_command_packet(tw_dev, request_id, 1)==0) {
1274 tw_dev->pending_head = (tw_dev->pending_head + 1) % TW_Q_LENGTH;
1275 tw_dev->pending_request_count--;
1276 } else {
1277 /* If we get here, we will continue re-posting on the next command interrupt */
1278 break;
1283 /* Handle response interrupt */
1284 if (status_reg_value & TW_STATUS_RESPONSE_INTERRUPT) {
1286 /* Drain the response queue from the board */
1287 while ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) {
1288 /* Complete the response */
1289 response_que.value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
1290 request_id = TW_RESID_OUT(response_que.response_id);
1291 full_command_packet = tw_dev->command_packet_virt[request_id];
1292 error = 0;
1293 /* Check for command packet errors */
1294 if (full_command_packet->command.newcommand.status != 0) {
1295 if (tw_dev->srb[request_id] != NULL) {
1296 error = twa_fill_sense(tw_dev, request_id, 1, 1);
1297 } else {
1298 /* Skip ioctl error prints */
1299 if (request_id != tw_dev->chrdev_request_id) {
1300 error = twa_fill_sense(tw_dev, request_id, 0, 1);
1305 /* Check for correct state */
1306 if (tw_dev->state[request_id] != TW_S_POSTED) {
1307 if (tw_dev->srb[request_id] != NULL) {
1308 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1a, "Received a request id that wasn't posted");
1309 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1310 goto twa_interrupt_bail;
1314 /* Check for internal command completion */
1315 if (tw_dev->srb[request_id] == NULL) {
1316 if (request_id != tw_dev->chrdev_request_id) {
1317 if (twa_aen_complete(tw_dev, request_id))
1318 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1b, "Error completing AEN during attention interrupt");
1319 } else {
1320 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1321 wake_up(&tw_dev->ioctl_wqueue);
1323 } else {
1324 struct scsi_cmnd *cmd;
1326 cmd = tw_dev->srb[request_id];
1328 twa_scsiop_execute_scsi_complete(tw_dev, request_id);
1329 /* If no error command was a success */
1330 if (error == 0) {
1331 cmd->result = (DID_OK << 16);
1334 /* If error, command failed */
1335 if (error == 1) {
1336 /* Ask for a host reset */
1337 cmd->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
1340 /* Report residual bytes for single sgl */
1341 if ((scsi_sg_count(cmd) <= 1) && (full_command_packet->command.newcommand.status == 0)) {
1342 if (full_command_packet->command.newcommand.sg_list[0].length < scsi_bufflen(tw_dev->srb[request_id]))
1343 scsi_set_resid(cmd, scsi_bufflen(cmd) - full_command_packet->command.newcommand.sg_list[0].length);
1346 /* Now complete the io */
1347 tw_dev->state[request_id] = TW_S_COMPLETED;
1348 twa_free_request_id(tw_dev, request_id);
1349 tw_dev->posted_request_count--;
1350 tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
1351 twa_unmap_scsi_data(tw_dev, request_id);
1354 /* Check for valid status after each drain */
1355 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1356 if (twa_check_bits(status_reg_value)) {
1357 if (twa_decode_bits(tw_dev, status_reg_value)) {
1358 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1359 goto twa_interrupt_bail;
1365 twa_interrupt_bail:
1366 spin_unlock(tw_dev->host->host_lock);
1367 return IRQ_RETVAL(handled);
1368 } /* End twa_interrupt() */
1370 /* This function will load the request id and various sgls for ioctls */
1371 static void twa_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full *full_command_packet, int request_id, dma_addr_t dma_handle, int length)
1373 TW_Command *oldcommand;
1374 TW_Command_Apache *newcommand;
1375 TW_SG_Entry *sgl;
1376 unsigned int pae = 0;
1378 if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4))
1379 pae = 1;
1381 if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
1382 newcommand = &full_command_packet->command.newcommand;
1383 newcommand->request_id__lunl =
1384 cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id));
1385 newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
1386 newcommand->sg_list[0].length = cpu_to_le32(length);
1387 newcommand->sgl_entries__lunh =
1388 cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), 1));
1389 } else {
1390 oldcommand = &full_command_packet->command.oldcommand;
1391 oldcommand->request_id = request_id;
1393 if (TW_SGL_OUT(oldcommand->opcode__sgloffset)) {
1394 /* Load the sg list */
1395 if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9690SA)
1396 sgl = (TW_SG_Entry *)((u32 *)oldcommand+oldcommand->size - (sizeof(TW_SG_Entry)/4) + pae);
1397 else
1398 sgl = (TW_SG_Entry *)((u32 *)oldcommand+TW_SGL_OUT(oldcommand->opcode__sgloffset));
1399 sgl->address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
1400 sgl->length = cpu_to_le32(length);
1402 oldcommand->size += pae;
1405 } /* End twa_load_sgl() */
1407 /* This function will perform a pci-dma mapping for a scatter gather list */
1408 static int twa_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id)
1410 int use_sg;
1411 struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1413 use_sg = scsi_dma_map(cmd);
1414 if (!use_sg)
1415 return 0;
1416 else if (use_sg < 0) {
1417 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter gather list");
1418 return 0;
1421 cmd->SCp.phase = TW_PHASE_SGLIST;
1422 cmd->SCp.have_data_in = use_sg;
1424 return use_sg;
1425 } /* End twa_map_scsi_sg_data() */
1427 /* This function will poll for a response interrupt of a request */
1428 static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds)
1430 int retval = 1, found = 0, response_request_id;
1431 TW_Response_Queue response_queue;
1432 TW_Command_Full *full_command_packet = tw_dev->command_packet_virt[request_id];
1434 if (twa_poll_status_gone(tw_dev, TW_STATUS_RESPONSE_QUEUE_EMPTY, seconds) == 0) {
1435 response_queue.value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
1436 response_request_id = TW_RESID_OUT(response_queue.response_id);
1437 if (request_id != response_request_id) {
1438 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1e, "Found unexpected request id while polling for response");
1439 goto out;
1441 if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
1442 if (full_command_packet->command.newcommand.status != 0) {
1443 /* bad response */
1444 twa_fill_sense(tw_dev, request_id, 0, 0);
1445 goto out;
1447 found = 1;
1448 } else {
1449 if (full_command_packet->command.oldcommand.status != 0) {
1450 /* bad response */
1451 twa_fill_sense(tw_dev, request_id, 0, 0);
1452 goto out;
1454 found = 1;
1458 if (found)
1459 retval = 0;
1460 out:
1461 return retval;
1462 } /* End twa_poll_response() */
1464 /* This function will poll the status register for a flag */
1465 static int twa_poll_status(TW_Device_Extension *tw_dev, u32 flag, int seconds)
1467 u32 status_reg_value;
1468 unsigned long before;
1469 int retval = 1;
1471 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1472 before = jiffies;
1474 if (twa_check_bits(status_reg_value))
1475 twa_decode_bits(tw_dev, status_reg_value);
1477 while ((status_reg_value & flag) != flag) {
1478 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1480 if (twa_check_bits(status_reg_value))
1481 twa_decode_bits(tw_dev, status_reg_value);
1483 if (time_after(jiffies, before + HZ * seconds))
1484 goto out;
1486 msleep(50);
1488 retval = 0;
1489 out:
1490 return retval;
1491 } /* End twa_poll_status() */
1493 /* This function will poll the status register for disappearance of a flag */
1494 static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int seconds)
1496 u32 status_reg_value;
1497 unsigned long before;
1498 int retval = 1;
1500 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1501 before = jiffies;
1503 if (twa_check_bits(status_reg_value))
1504 twa_decode_bits(tw_dev, status_reg_value);
1506 while ((status_reg_value & flag) != 0) {
1507 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1508 if (twa_check_bits(status_reg_value))
1509 twa_decode_bits(tw_dev, status_reg_value);
1511 if (time_after(jiffies, before + HZ * seconds))
1512 goto out;
1514 msleep(50);
1516 retval = 0;
1517 out:
1518 return retval;
1519 } /* End twa_poll_status_gone() */
1521 /* This function will attempt to post a command packet to the board */
1522 static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, char internal)
1524 u32 status_reg_value;
1525 dma_addr_t command_que_value;
1526 int retval = 1;
1528 command_que_value = tw_dev->command_packet_phys[request_id];
1530 /* For 9650SE write low 4 bytes first */
1531 if ((tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) ||
1532 (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9690SA)) {
1533 command_que_value += TW_COMMAND_OFFSET;
1534 writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev));
1537 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1539 if (twa_check_bits(status_reg_value))
1540 twa_decode_bits(tw_dev, status_reg_value);
1542 if (((tw_dev->pending_request_count > 0) && (tw_dev->state[request_id] != TW_S_PENDING)) || (status_reg_value & TW_STATUS_COMMAND_QUEUE_FULL)) {
1544 /* Only pend internal driver commands */
1545 if (!internal) {
1546 retval = SCSI_MLQUEUE_HOST_BUSY;
1547 goto out;
1550 /* Couldn't post the command packet, so we do it later */
1551 if (tw_dev->state[request_id] != TW_S_PENDING) {
1552 tw_dev->state[request_id] = TW_S_PENDING;
1553 tw_dev->pending_request_count++;
1554 if (tw_dev->pending_request_count > tw_dev->max_pending_request_count) {
1555 tw_dev->max_pending_request_count = tw_dev->pending_request_count;
1557 tw_dev->pending_queue[tw_dev->pending_tail] = request_id;
1558 tw_dev->pending_tail = (tw_dev->pending_tail + 1) % TW_Q_LENGTH;
1560 TW_UNMASK_COMMAND_INTERRUPT(tw_dev);
1561 goto out;
1562 } else {
1563 if ((tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) ||
1564 (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9690SA)) {
1565 /* Now write upper 4 bytes */
1566 writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev) + 0x4);
1567 } else {
1568 if (sizeof(dma_addr_t) > 4) {
1569 command_que_value += TW_COMMAND_OFFSET;
1570 writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
1571 writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4);
1572 } else {
1573 writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
1576 tw_dev->state[request_id] = TW_S_POSTED;
1577 tw_dev->posted_request_count++;
1578 if (tw_dev->posted_request_count > tw_dev->max_posted_request_count) {
1579 tw_dev->max_posted_request_count = tw_dev->posted_request_count;
1582 retval = 0;
1583 out:
1584 return retval;
1585 } /* End twa_post_command_packet() */
1587 /* This function will reset a device extension */
1588 static int twa_reset_device_extension(TW_Device_Extension *tw_dev)
1590 int i = 0;
1591 int retval = 1;
1592 unsigned long flags = 0;
1594 set_bit(TW_IN_RESET, &tw_dev->flags);
1595 TW_DISABLE_INTERRUPTS(tw_dev);
1596 TW_MASK_COMMAND_INTERRUPT(tw_dev);
1597 spin_lock_irqsave(tw_dev->host->host_lock, flags);
1599 /* Abort all requests that are in progress */
1600 for (i = 0; i < TW_Q_LENGTH; i++) {
1601 if ((tw_dev->state[i] != TW_S_FINISHED) &&
1602 (tw_dev->state[i] != TW_S_INITIAL) &&
1603 (tw_dev->state[i] != TW_S_COMPLETED)) {
1604 if (tw_dev->srb[i]) {
1605 tw_dev->srb[i]->result = (DID_RESET << 16);
1606 tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
1607 twa_unmap_scsi_data(tw_dev, i);
1612 /* Reset queues and counts */
1613 for (i = 0; i < TW_Q_LENGTH; i++) {
1614 tw_dev->free_queue[i] = i;
1615 tw_dev->state[i] = TW_S_INITIAL;
1617 tw_dev->free_head = TW_Q_START;
1618 tw_dev->free_tail = TW_Q_START;
1619 tw_dev->posted_request_count = 0;
1620 tw_dev->pending_request_count = 0;
1621 tw_dev->pending_head = TW_Q_START;
1622 tw_dev->pending_tail = TW_Q_START;
1623 tw_dev->reset_print = 0;
1625 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
1627 if (twa_reset_sequence(tw_dev, 1))
1628 goto out;
1630 TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
1631 clear_bit(TW_IN_RESET, &tw_dev->flags);
1632 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1634 retval = 0;
1635 out:
1636 return retval;
1637 } /* End twa_reset_device_extension() */
1639 /* This function will reset a controller */
1640 static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset)
1642 int tries = 0, retval = 1, flashed = 0, do_soft_reset = soft_reset;
1644 while (tries < TW_MAX_RESET_TRIES) {
1645 if (do_soft_reset) {
1646 TW_SOFT_RESET(tw_dev);
1647 /* Clear pchip/response queue on 9550SX */
1648 if (twa_empty_response_queue_large(tw_dev)) {
1649 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x36, "Response queue (large) empty failed during reset sequence");
1650 do_soft_reset = 1;
1651 tries++;
1652 continue;
1656 /* Make sure controller is in a good state */
1657 if (twa_poll_status(tw_dev, TW_STATUS_MICROCONTROLLER_READY | (do_soft_reset == 1 ? TW_STATUS_ATTENTION_INTERRUPT : 0), 60)) {
1658 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1f, "Microcontroller not ready during reset sequence");
1659 do_soft_reset = 1;
1660 tries++;
1661 continue;
1664 /* Empty response queue */
1665 if (twa_empty_response_queue(tw_dev)) {
1666 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x20, "Response queue empty failed during reset sequence");
1667 do_soft_reset = 1;
1668 tries++;
1669 continue;
1672 flashed = 0;
1674 /* Check for compatibility/flash */
1675 if (twa_check_srl(tw_dev, &flashed)) {
1676 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x21, "Compatibility check failed during reset sequence");
1677 do_soft_reset = 1;
1678 tries++;
1679 continue;
1680 } else {
1681 if (flashed) {
1682 tries++;
1683 continue;
1687 /* Drain the AEN queue */
1688 if (twa_aen_drain_queue(tw_dev, soft_reset)) {
1689 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x22, "AEN drain failed during reset sequence");
1690 do_soft_reset = 1;
1691 tries++;
1692 continue;
1695 /* If we got here, controller is in a good state */
1696 retval = 0;
1697 goto out;
1699 out:
1700 return retval;
1701 } /* End twa_reset_sequence() */
1703 /* This funciton returns unit geometry in cylinders/heads/sectors */
1704 static int twa_scsi_biosparam(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int geom[])
1706 int heads, sectors, cylinders;
1707 TW_Device_Extension *tw_dev;
1709 tw_dev = (TW_Device_Extension *)sdev->host->hostdata;
1711 if (capacity >= 0x200000) {
1712 heads = 255;
1713 sectors = 63;
1714 cylinders = sector_div(capacity, heads * sectors);
1715 } else {
1716 heads = 64;
1717 sectors = 32;
1718 cylinders = sector_div(capacity, heads * sectors);
1721 geom[0] = heads;
1722 geom[1] = sectors;
1723 geom[2] = cylinders;
1725 return 0;
1726 } /* End twa_scsi_biosparam() */
1728 /* This is the new scsi eh reset function */
1729 static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt)
1731 TW_Device_Extension *tw_dev = NULL;
1732 int retval = FAILED;
1734 tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1736 tw_dev->num_resets++;
1738 sdev_printk(KERN_WARNING, SCpnt->device,
1739 "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n",
1740 TW_DRIVER, 0x2c, SCpnt->cmnd[0]);
1742 /* Make sure we are not issuing an ioctl or resetting from ioctl */
1743 mutex_lock(&tw_dev->ioctl_lock);
1745 /* Now reset the card and some of the device extension data */
1746 if (twa_reset_device_extension(tw_dev)) {
1747 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset failed during scsi host reset");
1748 goto out;
1751 retval = SUCCESS;
1752 out:
1753 mutex_unlock(&tw_dev->ioctl_lock);
1754 return retval;
1755 } /* End twa_scsi_eh_reset() */
1757 /* This is the main scsi queue function to handle scsi opcodes */
1758 static int twa_scsi_queue(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
1760 int request_id, retval;
1761 TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1763 /* If we are resetting due to timed out ioctl, report as busy */
1764 if (test_bit(TW_IN_RESET, &tw_dev->flags)) {
1765 retval = SCSI_MLQUEUE_HOST_BUSY;
1766 goto out;
1769 /* Check if this FW supports luns */
1770 if ((SCpnt->device->lun != 0) && (tw_dev->tw_compat_info.working_srl < TW_FW_SRL_LUNS_SUPPORTED)) {
1771 SCpnt->result = (DID_BAD_TARGET << 16);
1772 done(SCpnt);
1773 retval = 0;
1774 goto out;
1777 /* Save done function into scsi_cmnd struct */
1778 SCpnt->scsi_done = done;
1780 /* Get a free request id */
1781 twa_get_request_id(tw_dev, &request_id);
1783 /* Save the scsi command for use by the ISR */
1784 tw_dev->srb[request_id] = SCpnt;
1786 /* Initialize phase to zero */
1787 SCpnt->SCp.phase = TW_PHASE_INITIAL;
1789 retval = twa_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL);
1790 switch (retval) {
1791 case SCSI_MLQUEUE_HOST_BUSY:
1792 twa_free_request_id(tw_dev, request_id);
1793 break;
1794 case 1:
1795 tw_dev->state[request_id] = TW_S_COMPLETED;
1796 twa_free_request_id(tw_dev, request_id);
1797 SCpnt->result = (DID_ERROR << 16);
1798 done(SCpnt);
1799 retval = 0;
1801 out:
1802 return retval;
1803 } /* End twa_scsi_queue() */
1805 /* This function hands scsi cdb's to the firmware */
1806 static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg)
1808 TW_Command_Full *full_command_packet;
1809 TW_Command_Apache *command_packet;
1810 u32 num_sectors = 0x0;
1811 int i, sg_count;
1812 struct scsi_cmnd *srb = NULL;
1813 struct scatterlist *sglist = NULL, *sg;
1814 int retval = 1;
1816 if (tw_dev->srb[request_id]) {
1817 srb = tw_dev->srb[request_id];
1818 if (scsi_sglist(srb))
1819 sglist = scsi_sglist(srb);
1822 /* Initialize command packet */
1823 full_command_packet = tw_dev->command_packet_virt[request_id];
1824 full_command_packet->header.header_desc.size_header = 128;
1825 full_command_packet->header.status_block.error = 0;
1826 full_command_packet->header.status_block.severity__reserved = 0;
1828 command_packet = &full_command_packet->command.newcommand;
1829 command_packet->status = 0;
1830 command_packet->opcode__reserved = TW_OPRES_IN(0, TW_OP_EXECUTE_SCSI);
1832 /* We forced 16 byte cdb use earlier */
1833 if (!cdb)
1834 memcpy(command_packet->cdb, srb->cmnd, TW_MAX_CDB_LEN);
1835 else
1836 memcpy(command_packet->cdb, cdb, TW_MAX_CDB_LEN);
1838 if (srb) {
1839 command_packet->unit = srb->device->id;
1840 command_packet->request_id__lunl =
1841 cpu_to_le16(TW_REQ_LUN_IN(srb->device->lun, request_id));
1842 } else {
1843 command_packet->request_id__lunl =
1844 cpu_to_le16(TW_REQ_LUN_IN(0, request_id));
1845 command_packet->unit = 0;
1848 command_packet->sgl_offset = 16;
1850 if (!sglistarg) {
1851 /* Map sglist from scsi layer to cmd packet */
1853 if (scsi_sg_count(srb)) {
1854 if ((scsi_sg_count(srb) == 1) &&
1855 (scsi_bufflen(srb) < TW_MIN_SGL_LENGTH)) {
1856 if (srb->sc_data_direction == DMA_TO_DEVICE ||
1857 srb->sc_data_direction == DMA_BIDIRECTIONAL)
1858 scsi_sg_copy_to_buffer(srb,
1859 tw_dev->generic_buffer_virt[request_id],
1860 TW_SECTOR_SIZE);
1861 command_packet->sg_list[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
1862 command_packet->sg_list[0].length = cpu_to_le32(TW_MIN_SGL_LENGTH);
1863 } else {
1864 sg_count = twa_map_scsi_sg_data(tw_dev, request_id);
1865 if (sg_count == 0)
1866 goto out;
1868 scsi_for_each_sg(srb, sg, sg_count, i) {
1869 command_packet->sg_list[i].address = TW_CPU_TO_SGL(sg_dma_address(sg));
1870 command_packet->sg_list[i].length = cpu_to_le32(sg_dma_len(sg));
1871 if (command_packet->sg_list[i].address & TW_CPU_TO_SGL(TW_ALIGNMENT_9000_SGL)) {
1872 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2e, "Found unaligned sgl address during execute scsi");
1873 goto out;
1877 command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN((srb->device->lun >> 4), scsi_sg_count(tw_dev->srb[request_id])));
1879 } else {
1880 /* Internal cdb post */
1881 for (i = 0; i < use_sg; i++) {
1882 command_packet->sg_list[i].address = TW_CPU_TO_SGL(sglistarg[i].address);
1883 command_packet->sg_list[i].length = cpu_to_le32(sglistarg[i].length);
1884 if (command_packet->sg_list[i].address & TW_CPU_TO_SGL(TW_ALIGNMENT_9000_SGL)) {
1885 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2f, "Found unaligned sgl address during internal post");
1886 goto out;
1889 command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN(0, use_sg));
1892 if (srb) {
1893 if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == WRITE_6)
1894 num_sectors = (u32)srb->cmnd[4];
1896 if (srb->cmnd[0] == READ_10 || srb->cmnd[0] == WRITE_10)
1897 num_sectors = (u32)srb->cmnd[8] | ((u32)srb->cmnd[7] << 8);
1900 /* Update sector statistic */
1901 tw_dev->sector_count = num_sectors;
1902 if (tw_dev->sector_count > tw_dev->max_sector_count)
1903 tw_dev->max_sector_count = tw_dev->sector_count;
1905 /* Update SG statistics */
1906 if (srb) {
1907 tw_dev->sgl_entries = scsi_sg_count(tw_dev->srb[request_id]);
1908 if (tw_dev->sgl_entries > tw_dev->max_sgl_entries)
1909 tw_dev->max_sgl_entries = tw_dev->sgl_entries;
1912 /* Now post the command to the board */
1913 if (srb) {
1914 retval = twa_post_command_packet(tw_dev, request_id, 0);
1915 } else {
1916 twa_post_command_packet(tw_dev, request_id, 1);
1917 retval = 0;
1919 out:
1920 return retval;
1921 } /* End twa_scsiop_execute_scsi() */
1923 /* This function completes an execute scsi operation */
1924 static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id)
1926 struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1928 if (scsi_bufflen(cmd) < TW_MIN_SGL_LENGTH &&
1929 (cmd->sc_data_direction == DMA_FROM_DEVICE ||
1930 cmd->sc_data_direction == DMA_BIDIRECTIONAL)) {
1931 if (scsi_sg_count(cmd) == 1) {
1932 void *buf = tw_dev->generic_buffer_virt[request_id];
1934 scsi_sg_copy_from_buffer(cmd, buf, TW_SECTOR_SIZE);
1937 } /* End twa_scsiop_execute_scsi_complete() */
1939 /* This function tells the controller to shut down */
1940 static void __twa_shutdown(TW_Device_Extension *tw_dev)
1942 /* Disable interrupts */
1943 TW_DISABLE_INTERRUPTS(tw_dev);
1945 /* Free up the IRQ */
1946 free_irq(tw_dev->tw_pci_dev->irq, tw_dev);
1948 printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no);
1950 /* Tell the card we are shutting down */
1951 if (twa_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) {
1952 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x31, "Connection shutdown failed");
1953 } else {
1954 printk(KERN_WARNING "3w-9xxx: Shutdown complete.\n");
1957 /* Clear all interrupts just before exit */
1958 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1959 } /* End __twa_shutdown() */
1961 /* Wrapper for __twa_shutdown */
1962 static void twa_shutdown(struct pci_dev *pdev)
1964 struct Scsi_Host *host = pci_get_drvdata(pdev);
1965 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
1967 __twa_shutdown(tw_dev);
1968 } /* End twa_shutdown() */
1970 /* This function will look up a string */
1971 static char *twa_string_lookup(twa_message_type *table, unsigned int code)
1973 int index;
1975 for (index = 0; ((code != table[index].code) &&
1976 (table[index].text != (char *)0)); index++);
1977 return(table[index].text);
1978 } /* End twa_string_lookup() */
1980 /* This function will perform a pci-dma unmap */
1981 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
1983 struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1985 if (cmd->SCp.phase == TW_PHASE_SGLIST)
1986 scsi_dma_unmap(cmd);
1987 } /* End twa_unmap_scsi_data() */
1989 /* scsi_host_template initializer */
1990 static struct scsi_host_template driver_template = {
1991 .module = THIS_MODULE,
1992 .name = "3ware 9000 Storage Controller",
1993 .queuecommand = twa_scsi_queue,
1994 .eh_host_reset_handler = twa_scsi_eh_reset,
1995 .bios_param = twa_scsi_biosparam,
1996 .change_queue_depth = twa_change_queue_depth,
1997 .can_queue = TW_Q_LENGTH-2,
1998 .this_id = -1,
1999 .sg_tablesize = TW_APACHE_MAX_SGL_LENGTH,
2000 .max_sectors = TW_MAX_SECTORS,
2001 .cmd_per_lun = TW_MAX_CMDS_PER_LUN,
2002 .use_clustering = ENABLE_CLUSTERING,
2003 .shost_attrs = twa_host_attrs,
2004 .emulated = 1
2007 /* This function will probe and initialize a card */
2008 static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
2010 struct Scsi_Host *host = NULL;
2011 TW_Device_Extension *tw_dev;
2012 unsigned long mem_addr, mem_len;
2013 int retval = -ENODEV;
2015 retval = pci_enable_device(pdev);
2016 if (retval) {
2017 TW_PRINTK(host, TW_DRIVER, 0x34, "Failed to enable pci device");
2018 goto out_disable_device;
2021 pci_set_master(pdev);
2022 pci_try_set_mwi(pdev);
2024 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64))
2025 || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))
2026 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
2027 || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
2028 TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask");
2029 retval = -ENODEV;
2030 goto out_disable_device;
2033 host = scsi_host_alloc(&driver_template, sizeof(TW_Device_Extension));
2034 if (!host) {
2035 TW_PRINTK(host, TW_DRIVER, 0x24, "Failed to allocate memory for device extension");
2036 retval = -ENOMEM;
2037 goto out_disable_device;
2039 tw_dev = (TW_Device_Extension *)host->hostdata;
2041 /* Save values to device extension */
2042 tw_dev->host = host;
2043 tw_dev->tw_pci_dev = pdev;
2045 if (twa_initialize_device_extension(tw_dev)) {
2046 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x25, "Failed to initialize device extension");
2047 goto out_free_device_extension;
2050 /* Request IO regions */
2051 retval = pci_request_regions(pdev, "3w-9xxx");
2052 if (retval) {
2053 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x26, "Failed to get mem region");
2054 goto out_free_device_extension;
2057 if (pdev->device == PCI_DEVICE_ID_3WARE_9000) {
2058 mem_addr = pci_resource_start(pdev, 1);
2059 mem_len = pci_resource_len(pdev, 1);
2060 } else {
2061 mem_addr = pci_resource_start(pdev, 2);
2062 mem_len = pci_resource_len(pdev, 2);
2065 /* Save base address */
2066 tw_dev->base_addr = ioremap(mem_addr, mem_len);
2067 if (!tw_dev->base_addr) {
2068 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x35, "Failed to ioremap");
2069 goto out_release_mem_region;
2072 /* Disable interrupts on the card */
2073 TW_DISABLE_INTERRUPTS(tw_dev);
2075 /* Initialize the card */
2076 if (twa_reset_sequence(tw_dev, 0))
2077 goto out_iounmap;
2079 /* Set host specific parameters */
2080 if ((pdev->device == PCI_DEVICE_ID_3WARE_9650SE) ||
2081 (pdev->device == PCI_DEVICE_ID_3WARE_9690SA))
2082 host->max_id = TW_MAX_UNITS_9650SE;
2083 else
2084 host->max_id = TW_MAX_UNITS;
2086 host->max_cmd_len = TW_MAX_CDB_LEN;
2088 /* Channels aren't supported by adapter */
2089 host->max_lun = TW_MAX_LUNS(tw_dev->tw_compat_info.working_srl);
2090 host->max_channel = 0;
2092 /* Register the card with the kernel SCSI layer */
2093 retval = scsi_add_host(host, &pdev->dev);
2094 if (retval) {
2095 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed");
2096 goto out_iounmap;
2099 pci_set_drvdata(pdev, host);
2101 printk(KERN_WARNING "3w-9xxx: scsi%d: Found a 3ware 9000 Storage Controller at 0x%lx, IRQ: %d.\n",
2102 host->host_no, mem_addr, pdev->irq);
2103 printk(KERN_WARNING "3w-9xxx: scsi%d: Firmware %s, BIOS %s, Ports: %d.\n",
2104 host->host_no,
2105 (char *)twa_get_param(tw_dev, 0, TW_VERSION_TABLE,
2106 TW_PARAM_FWVER, TW_PARAM_FWVER_LENGTH),
2107 (char *)twa_get_param(tw_dev, 1, TW_VERSION_TABLE,
2108 TW_PARAM_BIOSVER, TW_PARAM_BIOSVER_LENGTH),
2109 le32_to_cpu(*(int *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE,
2110 TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH)));
2112 /* Try to enable MSI */
2113 if (use_msi && (pdev->device != PCI_DEVICE_ID_3WARE_9000) &&
2114 !pci_enable_msi(pdev))
2115 set_bit(TW_USING_MSI, &tw_dev->flags);
2117 /* Now setup the interrupt handler */
2118 retval = request_irq(pdev->irq, twa_interrupt, IRQF_SHARED, "3w-9xxx", tw_dev);
2119 if (retval) {
2120 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x30, "Error requesting IRQ");
2121 goto out_remove_host;
2124 twa_device_extension_list[twa_device_extension_count] = tw_dev;
2125 twa_device_extension_count++;
2127 /* Re-enable interrupts on the card */
2128 TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
2130 /* Finally, scan the host */
2131 scsi_scan_host(host);
2133 if (twa_major == -1) {
2134 if ((twa_major = register_chrdev (0, "twa", &twa_fops)) < 0)
2135 TW_PRINTK(host, TW_DRIVER, 0x29, "Failed to register character device");
2137 return 0;
2139 out_remove_host:
2140 if (test_bit(TW_USING_MSI, &tw_dev->flags))
2141 pci_disable_msi(pdev);
2142 scsi_remove_host(host);
2143 out_iounmap:
2144 iounmap(tw_dev->base_addr);
2145 out_release_mem_region:
2146 pci_release_regions(pdev);
2147 out_free_device_extension:
2148 twa_free_device_extension(tw_dev);
2149 scsi_host_put(host);
2150 out_disable_device:
2151 pci_disable_device(pdev);
2153 return retval;
2154 } /* End twa_probe() */
2156 /* This function is called to remove a device */
2157 static void twa_remove(struct pci_dev *pdev)
2159 struct Scsi_Host *host = pci_get_drvdata(pdev);
2160 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
2162 scsi_remove_host(tw_dev->host);
2164 /* Unregister character device */
2165 if (twa_major >= 0) {
2166 unregister_chrdev(twa_major, "twa");
2167 twa_major = -1;
2170 /* Shutdown the card */
2171 __twa_shutdown(tw_dev);
2173 /* Disable MSI if enabled */
2174 if (test_bit(TW_USING_MSI, &tw_dev->flags))
2175 pci_disable_msi(pdev);
2177 /* Free IO remapping */
2178 iounmap(tw_dev->base_addr);
2180 /* Free up the mem region */
2181 pci_release_regions(pdev);
2183 /* Free up device extension resources */
2184 twa_free_device_extension(tw_dev);
2186 scsi_host_put(tw_dev->host);
2187 pci_disable_device(pdev);
2188 twa_device_extension_count--;
2189 } /* End twa_remove() */
2191 #ifdef CONFIG_PM
2192 /* This function is called on PCI suspend */
2193 static int twa_suspend(struct pci_dev *pdev, pm_message_t state)
2195 struct Scsi_Host *host = pci_get_drvdata(pdev);
2196 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
2198 printk(KERN_WARNING "3w-9xxx: Suspending host %d.\n", tw_dev->host->host_no);
2200 TW_DISABLE_INTERRUPTS(tw_dev);
2201 free_irq(tw_dev->tw_pci_dev->irq, tw_dev);
2203 if (test_bit(TW_USING_MSI, &tw_dev->flags))
2204 pci_disable_msi(pdev);
2206 /* Tell the card we are shutting down */
2207 if (twa_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) {
2208 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x38, "Connection shutdown failed during suspend");
2209 } else {
2210 printk(KERN_WARNING "3w-9xxx: Suspend complete.\n");
2212 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
2214 pci_save_state(pdev);
2215 pci_disable_device(pdev);
2216 pci_set_power_state(pdev, pci_choose_state(pdev, state));
2218 return 0;
2219 } /* End twa_suspend() */
2221 /* This function is called on PCI resume */
2222 static int twa_resume(struct pci_dev *pdev)
2224 int retval = 0;
2225 struct Scsi_Host *host = pci_get_drvdata(pdev);
2226 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
2228 printk(KERN_WARNING "3w-9xxx: Resuming host %d.\n", tw_dev->host->host_no);
2229 pci_set_power_state(pdev, PCI_D0);
2230 pci_enable_wake(pdev, PCI_D0, 0);
2231 pci_restore_state(pdev);
2233 retval = pci_enable_device(pdev);
2234 if (retval) {
2235 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x39, "Enable device failed during resume");
2236 return retval;
2239 pci_set_master(pdev);
2240 pci_try_set_mwi(pdev);
2242 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64))
2243 || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))
2244 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
2245 || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
2246 TW_PRINTK(host, TW_DRIVER, 0x40, "Failed to set dma mask during resume");
2247 retval = -ENODEV;
2248 goto out_disable_device;
2251 /* Initialize the card */
2252 if (twa_reset_sequence(tw_dev, 0)) {
2253 retval = -ENODEV;
2254 goto out_disable_device;
2257 /* Now setup the interrupt handler */
2258 retval = request_irq(pdev->irq, twa_interrupt, IRQF_SHARED, "3w-9xxx", tw_dev);
2259 if (retval) {
2260 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x42, "Error requesting IRQ during resume");
2261 retval = -ENODEV;
2262 goto out_disable_device;
2265 /* Now enable MSI if enabled */
2266 if (test_bit(TW_USING_MSI, &tw_dev->flags))
2267 pci_enable_msi(pdev);
2269 /* Re-enable interrupts on the card */
2270 TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
2272 printk(KERN_WARNING "3w-9xxx: Resume complete.\n");
2273 return 0;
2275 out_disable_device:
2276 scsi_remove_host(host);
2277 pci_disable_device(pdev);
2279 return retval;
2280 } /* End twa_resume() */
2281 #endif
2283 /* PCI Devices supported by this driver */
2284 static struct pci_device_id twa_pci_tbl[] __devinitdata = {
2285 { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9000,
2286 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2287 { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX,
2288 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2289 { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9650SE,
2290 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2291 { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9690SA,
2292 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2295 MODULE_DEVICE_TABLE(pci, twa_pci_tbl);
2297 /* pci_driver initializer */
2298 static struct pci_driver twa_driver = {
2299 .name = "3w-9xxx",
2300 .id_table = twa_pci_tbl,
2301 .probe = twa_probe,
2302 .remove = twa_remove,
2303 #ifdef CONFIG_PM
2304 .suspend = twa_suspend,
2305 .resume = twa_resume,
2306 #endif
2307 .shutdown = twa_shutdown
2310 /* This function is called on driver initialization */
2311 static int __init twa_init(void)
2313 printk(KERN_WARNING "3ware 9000 Storage Controller device driver for Linux v%s.\n", TW_DRIVER_VERSION);
2315 return pci_register_driver(&twa_driver);
2316 } /* End twa_init() */
2318 /* This function is called on driver exit */
2319 static void __exit twa_exit(void)
2321 pci_unregister_driver(&twa_driver);
2322 } /* End twa_exit() */
2324 module_init(twa_init);
2325 module_exit(twa_exit);