firewire: core: fw_iso_resource_manage: return -EBUSY when out of resources
[linux/fpc-iii.git] / drivers / scsi / 3w-9xxx.c
blob84d3bbaa95e7868f8cb3d2aa20e3844c721e79c6
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.
79 2.26.02.013 - Fix bug in twa_load_sgl().
82 #include <linux/module.h>
83 #include <linux/reboot.h>
84 #include <linux/spinlock.h>
85 #include <linux/interrupt.h>
86 #include <linux/moduleparam.h>
87 #include <linux/errno.h>
88 #include <linux/types.h>
89 #include <linux/delay.h>
90 #include <linux/pci.h>
91 #include <linux/time.h>
92 #include <linux/mutex.h>
93 #include <linux/smp_lock.h>
94 #include <asm/io.h>
95 #include <asm/irq.h>
96 #include <asm/uaccess.h>
97 #include <scsi/scsi.h>
98 #include <scsi/scsi_host.h>
99 #include <scsi/scsi_tcq.h>
100 #include <scsi/scsi_cmnd.h>
101 #include "3w-9xxx.h"
103 /* Globals */
104 #define TW_DRIVER_VERSION "2.26.02.013"
105 static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT];
106 static unsigned int twa_device_extension_count;
107 static int twa_major = -1;
108 extern struct timezone sys_tz;
110 /* Module parameters */
111 MODULE_AUTHOR ("AMCC");
112 MODULE_DESCRIPTION ("3ware 9000 Storage Controller Linux Driver");
113 MODULE_LICENSE("GPL");
114 MODULE_VERSION(TW_DRIVER_VERSION);
116 static int use_msi = 0;
117 module_param(use_msi, int, S_IRUGO);
118 MODULE_PARM_DESC(use_msi, "Use Message Signaled Interrupts. Default: 0");
120 /* Function prototypes */
121 static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header);
122 static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id);
123 static char *twa_aen_severity_lookup(unsigned char severity_code);
124 static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id);
125 static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
126 static int twa_chrdev_open(struct inode *inode, struct file *file);
127 static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host);
128 static void twa_free_request_id(TW_Device_Extension *tw_dev,int request_id);
129 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id);
130 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
131 u32 set_features, unsigned short current_fw_srl,
132 unsigned short current_fw_arch_id,
133 unsigned short current_fw_branch,
134 unsigned short current_fw_build,
135 unsigned short *fw_on_ctlr_srl,
136 unsigned short *fw_on_ctlr_arch_id,
137 unsigned short *fw_on_ctlr_branch,
138 unsigned short *fw_on_ctlr_build,
139 u32 *init_connect_result);
140 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);
141 static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds);
142 static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int seconds);
143 static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, char internal);
144 static int twa_reset_device_extension(TW_Device_Extension *tw_dev);
145 static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset);
146 static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg);
147 static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id);
148 static char *twa_string_lookup(twa_message_type *table, unsigned int aen_code);
149 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id);
151 /* Functions */
153 /* Show some statistics about the card */
154 static ssize_t twa_show_stats(struct device *dev,
155 struct device_attribute *attr, char *buf)
157 struct Scsi_Host *host = class_to_shost(dev);
158 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
159 unsigned long flags = 0;
160 ssize_t len;
162 spin_lock_irqsave(tw_dev->host->host_lock, flags);
163 len = snprintf(buf, PAGE_SIZE, "3w-9xxx Driver version: %s\n"
164 "Current commands posted: %4d\n"
165 "Max commands posted: %4d\n"
166 "Current pending commands: %4d\n"
167 "Max pending commands: %4d\n"
168 "Last sgl length: %4d\n"
169 "Max sgl length: %4d\n"
170 "Last sector count: %4d\n"
171 "Max sector count: %4d\n"
172 "SCSI Host Resets: %4d\n"
173 "AEN's: %4d\n",
174 TW_DRIVER_VERSION,
175 tw_dev->posted_request_count,
176 tw_dev->max_posted_request_count,
177 tw_dev->pending_request_count,
178 tw_dev->max_pending_request_count,
179 tw_dev->sgl_entries,
180 tw_dev->max_sgl_entries,
181 tw_dev->sector_count,
182 tw_dev->max_sector_count,
183 tw_dev->num_resets,
184 tw_dev->aen_count);
185 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
186 return len;
187 } /* End twa_show_stats() */
189 /* This function will set a devices queue depth */
190 static int twa_change_queue_depth(struct scsi_device *sdev, int queue_depth,
191 int reason)
193 if (reason != SCSI_QDEPTH_DEFAULT)
194 return -EOPNOTSUPP;
196 if (queue_depth > TW_Q_LENGTH-2)
197 queue_depth = TW_Q_LENGTH-2;
198 scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, queue_depth);
199 return queue_depth;
200 } /* End twa_change_queue_depth() */
202 /* Create sysfs 'stats' entry */
203 static struct device_attribute twa_host_stats_attr = {
204 .attr = {
205 .name = "stats",
206 .mode = S_IRUGO,
208 .show = twa_show_stats
211 /* Host attributes initializer */
212 static struct device_attribute *twa_host_attrs[] = {
213 &twa_host_stats_attr,
214 NULL,
217 /* File operations struct for character device */
218 static const struct file_operations twa_fops = {
219 .owner = THIS_MODULE,
220 .ioctl = twa_chrdev_ioctl,
221 .open = twa_chrdev_open,
222 .release = NULL
225 /* This function will complete an aen request from the isr */
226 static int twa_aen_complete(TW_Device_Extension *tw_dev, int request_id)
228 TW_Command_Full *full_command_packet;
229 TW_Command *command_packet;
230 TW_Command_Apache_Header *header;
231 unsigned short aen;
232 int retval = 1;
234 header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
235 tw_dev->posted_request_count--;
236 aen = le16_to_cpu(header->status_block.error);
237 full_command_packet = tw_dev->command_packet_virt[request_id];
238 command_packet = &full_command_packet->command.oldcommand;
240 /* First check for internal completion of set param for time sync */
241 if (TW_OP_OUT(command_packet->opcode__sgloffset) == TW_OP_SET_PARAM) {
242 /* Keep reading the queue in case there are more aen's */
243 if (twa_aen_read_queue(tw_dev, request_id))
244 goto out2;
245 else {
246 retval = 0;
247 goto out;
251 switch (aen) {
252 case TW_AEN_QUEUE_EMPTY:
253 /* Quit reading the queue if this is the last one */
254 break;
255 case TW_AEN_SYNC_TIME_WITH_HOST:
256 twa_aen_sync_time(tw_dev, request_id);
257 retval = 0;
258 goto out;
259 default:
260 twa_aen_queue_event(tw_dev, header);
262 /* If there are more aen's, keep reading the queue */
263 if (twa_aen_read_queue(tw_dev, request_id))
264 goto out2;
265 else {
266 retval = 0;
267 goto out;
270 retval = 0;
271 out2:
272 tw_dev->state[request_id] = TW_S_COMPLETED;
273 twa_free_request_id(tw_dev, request_id);
274 clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
275 out:
276 return retval;
277 } /* End twa_aen_complete() */
279 /* This function will drain aen queue */
280 static int twa_aen_drain_queue(TW_Device_Extension *tw_dev, int no_check_reset)
282 int request_id = 0;
283 char cdb[TW_MAX_CDB_LEN];
284 TW_SG_Entry sglist[1];
285 int finished = 0, count = 0;
286 TW_Command_Full *full_command_packet;
287 TW_Command_Apache_Header *header;
288 unsigned short aen;
289 int first_reset = 0, queue = 0, retval = 1;
291 if (no_check_reset)
292 first_reset = 0;
293 else
294 first_reset = 1;
296 full_command_packet = tw_dev->command_packet_virt[request_id];
297 memset(full_command_packet, 0, sizeof(TW_Command_Full));
299 /* Initialize cdb */
300 memset(&cdb, 0, TW_MAX_CDB_LEN);
301 cdb[0] = REQUEST_SENSE; /* opcode */
302 cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
304 /* Initialize sglist */
305 memset(&sglist, 0, sizeof(TW_SG_Entry));
306 sglist[0].length = TW_SECTOR_SIZE;
307 sglist[0].address = tw_dev->generic_buffer_phys[request_id];
309 if (sglist[0].address & TW_ALIGNMENT_9000_SGL) {
310 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Found unaligned address during AEN drain");
311 goto out;
314 /* Mark internal command */
315 tw_dev->srb[request_id] = NULL;
317 do {
318 /* Send command to the board */
319 if (twa_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
320 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2, "Error posting request sense");
321 goto out;
324 /* Now poll for completion */
325 if (twa_poll_response(tw_dev, request_id, 30)) {
326 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x3, "No valid response while draining AEN queue");
327 tw_dev->posted_request_count--;
328 goto out;
331 tw_dev->posted_request_count--;
332 header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
333 aen = le16_to_cpu(header->status_block.error);
334 queue = 0;
335 count++;
337 switch (aen) {
338 case TW_AEN_QUEUE_EMPTY:
339 if (first_reset != 1)
340 goto out;
341 else
342 finished = 1;
343 break;
344 case TW_AEN_SOFT_RESET:
345 if (first_reset == 0)
346 first_reset = 1;
347 else
348 queue = 1;
349 break;
350 case TW_AEN_SYNC_TIME_WITH_HOST:
351 break;
352 default:
353 queue = 1;
356 /* Now queue an event info */
357 if (queue)
358 twa_aen_queue_event(tw_dev, header);
359 } while ((finished == 0) && (count < TW_MAX_AEN_DRAIN));
361 if (count == TW_MAX_AEN_DRAIN)
362 goto out;
364 retval = 0;
365 out:
366 tw_dev->state[request_id] = TW_S_INITIAL;
367 return retval;
368 } /* End twa_aen_drain_queue() */
370 /* This function will queue an event */
371 static void twa_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header)
373 u32 local_time;
374 struct timeval time;
375 TW_Event *event;
376 unsigned short aen;
377 char host[16];
378 char *error_str;
380 tw_dev->aen_count++;
382 /* Fill out event info */
383 event = tw_dev->event_queue[tw_dev->error_index];
385 /* Check for clobber */
386 host[0] = '\0';
387 if (tw_dev->host) {
388 sprintf(host, " scsi%d:", tw_dev->host->host_no);
389 if (event->retrieved == TW_AEN_NOT_RETRIEVED)
390 tw_dev->aen_clobber = 1;
393 aen = le16_to_cpu(header->status_block.error);
394 memset(event, 0, sizeof(TW_Event));
396 event->severity = TW_SEV_OUT(header->status_block.severity__reserved);
397 do_gettimeofday(&time);
398 local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60));
399 event->time_stamp_sec = local_time;
400 event->aen_code = aen;
401 event->retrieved = TW_AEN_NOT_RETRIEVED;
402 event->sequence_id = tw_dev->error_sequence_id;
403 tw_dev->error_sequence_id++;
405 /* Check for embedded error string */
406 error_str = &(header->err_specific_desc[strlen(header->err_specific_desc)+1]);
408 header->err_specific_desc[sizeof(header->err_specific_desc) - 1] = '\0';
409 event->parameter_len = strlen(header->err_specific_desc);
410 memcpy(event->parameter_data, header->err_specific_desc, event->parameter_len + (error_str[0] == '\0' ? 0 : (1 + strlen(error_str))));
411 if (event->severity != TW_AEN_SEVERITY_DEBUG)
412 printk(KERN_WARNING "3w-9xxx:%s AEN: %s (0x%02X:0x%04X): %s:%s.\n",
413 host,
414 twa_aen_severity_lookup(TW_SEV_OUT(header->status_block.severity__reserved)),
415 TW_MESSAGE_SOURCE_CONTROLLER_EVENT, aen,
416 error_str[0] == '\0' ? twa_string_lookup(twa_aen_table, aen) : error_str,
417 header->err_specific_desc);
418 else
419 tw_dev->aen_count--;
421 if ((tw_dev->error_index + 1) == TW_Q_LENGTH)
422 tw_dev->event_queue_wrapped = 1;
423 tw_dev->error_index = (tw_dev->error_index + 1 ) % TW_Q_LENGTH;
424 } /* End twa_aen_queue_event() */
426 /* This function will read the aen queue from the isr */
427 static int twa_aen_read_queue(TW_Device_Extension *tw_dev, int request_id)
429 char cdb[TW_MAX_CDB_LEN];
430 TW_SG_Entry sglist[1];
431 TW_Command_Full *full_command_packet;
432 int retval = 1;
434 full_command_packet = tw_dev->command_packet_virt[request_id];
435 memset(full_command_packet, 0, sizeof(TW_Command_Full));
437 /* Initialize cdb */
438 memset(&cdb, 0, TW_MAX_CDB_LEN);
439 cdb[0] = REQUEST_SENSE; /* opcode */
440 cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
442 /* Initialize sglist */
443 memset(&sglist, 0, sizeof(TW_SG_Entry));
444 sglist[0].length = TW_SECTOR_SIZE;
445 sglist[0].address = tw_dev->generic_buffer_phys[request_id];
447 /* Mark internal command */
448 tw_dev->srb[request_id] = NULL;
450 /* Now post the command packet */
451 if (twa_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
452 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x4, "Post failed while reading AEN queue");
453 goto out;
455 retval = 0;
456 out:
457 return retval;
458 } /* End twa_aen_read_queue() */
460 /* This function will look up an AEN severity string */
461 static char *twa_aen_severity_lookup(unsigned char severity_code)
463 char *retval = NULL;
465 if ((severity_code < (unsigned char) TW_AEN_SEVERITY_ERROR) ||
466 (severity_code > (unsigned char) TW_AEN_SEVERITY_DEBUG))
467 goto out;
469 retval = twa_aen_severity_table[severity_code];
470 out:
471 return retval;
472 } /* End twa_aen_severity_lookup() */
474 /* This function will sync firmware time with the host time */
475 static void twa_aen_sync_time(TW_Device_Extension *tw_dev, int request_id)
477 u32 schedulertime;
478 struct timeval utc;
479 TW_Command_Full *full_command_packet;
480 TW_Command *command_packet;
481 TW_Param_Apache *param;
482 u32 local_time;
484 /* Fill out the command packet */
485 full_command_packet = tw_dev->command_packet_virt[request_id];
486 memset(full_command_packet, 0, sizeof(TW_Command_Full));
487 command_packet = &full_command_packet->command.oldcommand;
488 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_SET_PARAM);
489 command_packet->request_id = request_id;
490 command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
491 command_packet->byte8_offset.param.sgl[0].length = cpu_to_le32(TW_SECTOR_SIZE);
492 command_packet->size = TW_COMMAND_SIZE;
493 command_packet->byte6_offset.parameter_count = cpu_to_le16(1);
495 /* Setup the param */
496 param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
497 memset(param, 0, TW_SECTOR_SIZE);
498 param->table_id = cpu_to_le16(TW_TIMEKEEP_TABLE | 0x8000); /* Controller time keep table */
499 param->parameter_id = cpu_to_le16(0x3); /* SchedulerTime */
500 param->parameter_size_bytes = cpu_to_le16(4);
502 /* Convert system time in UTC to local time seconds since last
503 Sunday 12:00AM */
504 do_gettimeofday(&utc);
505 local_time = (u32)(utc.tv_sec - (sys_tz.tz_minuteswest * 60));
506 schedulertime = local_time - (3 * 86400);
507 schedulertime = cpu_to_le32(schedulertime % 604800);
509 memcpy(param->data, &schedulertime, sizeof(u32));
511 /* Mark internal command */
512 tw_dev->srb[request_id] = NULL;
514 /* Now post the command */
515 twa_post_command_packet(tw_dev, request_id, 1);
516 } /* End twa_aen_sync_time() */
518 /* This function will allocate memory and check if it is correctly aligned */
519 static int twa_allocate_memory(TW_Device_Extension *tw_dev, int size, int which)
521 int i;
522 dma_addr_t dma_handle;
523 unsigned long *cpu_addr;
524 int retval = 1;
526 cpu_addr = pci_alloc_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, &dma_handle);
527 if (!cpu_addr) {
528 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x5, "Memory allocation failed");
529 goto out;
532 if ((unsigned long)cpu_addr % (TW_ALIGNMENT_9000)) {
533 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x6, "Failed to allocate correctly aligned memory");
534 pci_free_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, cpu_addr, dma_handle);
535 goto out;
538 memset(cpu_addr, 0, size*TW_Q_LENGTH);
540 for (i = 0; i < TW_Q_LENGTH; i++) {
541 switch(which) {
542 case 0:
543 tw_dev->command_packet_phys[i] = dma_handle+(i*size);
544 tw_dev->command_packet_virt[i] = (TW_Command_Full *)((unsigned char *)cpu_addr + (i*size));
545 break;
546 case 1:
547 tw_dev->generic_buffer_phys[i] = dma_handle+(i*size);
548 tw_dev->generic_buffer_virt[i] = (unsigned long *)((unsigned char *)cpu_addr + (i*size));
549 break;
552 retval = 0;
553 out:
554 return retval;
555 } /* End twa_allocate_memory() */
557 /* This function will check the status register for unexpected bits */
558 static int twa_check_bits(u32 status_reg_value)
560 int retval = 1;
562 if ((status_reg_value & TW_STATUS_EXPECTED_BITS) != TW_STATUS_EXPECTED_BITS)
563 goto out;
564 if ((status_reg_value & TW_STATUS_UNEXPECTED_BITS) != 0)
565 goto out;
567 retval = 0;
568 out:
569 return retval;
570 } /* End twa_check_bits() */
572 /* This function will check the srl and decide if we are compatible */
573 static int twa_check_srl(TW_Device_Extension *tw_dev, int *flashed)
575 int retval = 1;
576 unsigned short fw_on_ctlr_srl = 0, fw_on_ctlr_arch_id = 0;
577 unsigned short fw_on_ctlr_branch = 0, fw_on_ctlr_build = 0;
578 u32 init_connect_result = 0;
580 if (twa_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
581 TW_EXTENDED_INIT_CONNECT, TW_CURRENT_DRIVER_SRL,
582 TW_9000_ARCH_ID, TW_CURRENT_DRIVER_BRANCH,
583 TW_CURRENT_DRIVER_BUILD, &fw_on_ctlr_srl,
584 &fw_on_ctlr_arch_id, &fw_on_ctlr_branch,
585 &fw_on_ctlr_build, &init_connect_result)) {
586 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x7, "Initconnection failed while checking SRL");
587 goto out;
590 tw_dev->tw_compat_info.working_srl = fw_on_ctlr_srl;
591 tw_dev->tw_compat_info.working_branch = fw_on_ctlr_branch;
592 tw_dev->tw_compat_info.working_build = fw_on_ctlr_build;
594 /* Try base mode compatibility */
595 if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
596 if (twa_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
597 TW_EXTENDED_INIT_CONNECT,
598 TW_BASE_FW_SRL, TW_9000_ARCH_ID,
599 TW_BASE_FW_BRANCH, TW_BASE_FW_BUILD,
600 &fw_on_ctlr_srl, &fw_on_ctlr_arch_id,
601 &fw_on_ctlr_branch, &fw_on_ctlr_build,
602 &init_connect_result)) {
603 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xa, "Initconnection (base mode) failed while checking SRL");
604 goto out;
606 if (!(init_connect_result & TW_CTLR_FW_COMPATIBLE)) {
607 if (TW_CURRENT_DRIVER_SRL > fw_on_ctlr_srl) {
608 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x32, "Firmware and driver incompatibility: please upgrade firmware");
609 } else {
610 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x33, "Firmware and driver incompatibility: please upgrade driver");
612 goto out;
614 tw_dev->tw_compat_info.working_srl = TW_BASE_FW_SRL;
615 tw_dev->tw_compat_info.working_branch = TW_BASE_FW_BRANCH;
616 tw_dev->tw_compat_info.working_build = TW_BASE_FW_BUILD;
619 /* Load rest of compatibility struct */
620 strncpy(tw_dev->tw_compat_info.driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION));
621 tw_dev->tw_compat_info.driver_srl_high = TW_CURRENT_DRIVER_SRL;
622 tw_dev->tw_compat_info.driver_branch_high = TW_CURRENT_DRIVER_BRANCH;
623 tw_dev->tw_compat_info.driver_build_high = TW_CURRENT_DRIVER_BUILD;
624 tw_dev->tw_compat_info.driver_srl_low = TW_BASE_FW_SRL;
625 tw_dev->tw_compat_info.driver_branch_low = TW_BASE_FW_BRANCH;
626 tw_dev->tw_compat_info.driver_build_low = TW_BASE_FW_BUILD;
627 tw_dev->tw_compat_info.fw_on_ctlr_srl = fw_on_ctlr_srl;
628 tw_dev->tw_compat_info.fw_on_ctlr_branch = fw_on_ctlr_branch;
629 tw_dev->tw_compat_info.fw_on_ctlr_build = fw_on_ctlr_build;
631 retval = 0;
632 out:
633 return retval;
634 } /* End twa_check_srl() */
636 /* This function handles ioctl for the character device */
637 static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
639 long timeout;
640 unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0;
641 dma_addr_t dma_handle;
642 int request_id = 0;
643 unsigned int sequence_id = 0;
644 unsigned char event_index, start_index;
645 TW_Ioctl_Driver_Command driver_command;
646 TW_Ioctl_Buf_Apache *tw_ioctl;
647 TW_Lock *tw_lock;
648 TW_Command_Full *full_command_packet;
649 TW_Compatibility_Info *tw_compat_info;
650 TW_Event *event;
651 struct timeval current_time;
652 u32 current_time_ms;
653 TW_Device_Extension *tw_dev = twa_device_extension_list[iminor(inode)];
654 int retval = TW_IOCTL_ERROR_OS_EFAULT;
655 void __user *argp = (void __user *)arg;
657 /* Only let one of these through at a time */
658 if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) {
659 retval = TW_IOCTL_ERROR_OS_EINTR;
660 goto out;
663 /* First copy down the driver command */
664 if (copy_from_user(&driver_command, argp, sizeof(TW_Ioctl_Driver_Command)))
665 goto out2;
667 /* Check data buffer size */
668 if (driver_command.buffer_length > TW_MAX_SECTORS * 2048) {
669 retval = TW_IOCTL_ERROR_OS_EINVAL;
670 goto out2;
673 /* Hardware can only do multiple of 512 byte transfers */
674 data_buffer_length_adjusted = (driver_command.buffer_length + 511) & ~511;
676 /* Now allocate ioctl buf memory */
677 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);
678 if (!cpu_addr) {
679 retval = TW_IOCTL_ERROR_OS_ENOMEM;
680 goto out2;
683 tw_ioctl = (TW_Ioctl_Buf_Apache *)cpu_addr;
685 /* Now copy down the entire ioctl */
686 if (copy_from_user(tw_ioctl, argp, driver_command.buffer_length + sizeof(TW_Ioctl_Buf_Apache) - 1))
687 goto out3;
689 /* See which ioctl we are doing */
690 switch (cmd) {
691 case TW_IOCTL_FIRMWARE_PASS_THROUGH:
692 spin_lock_irqsave(tw_dev->host->host_lock, flags);
693 twa_get_request_id(tw_dev, &request_id);
695 /* Flag internal command */
696 tw_dev->srb[request_id] = NULL;
698 /* Flag chrdev ioctl */
699 tw_dev->chrdev_request_id = request_id;
701 full_command_packet = &tw_ioctl->firmware_command;
703 /* Load request id and sglist for both command types */
704 twa_load_sgl(tw_dev, full_command_packet, request_id, dma_handle, data_buffer_length_adjusted);
706 memcpy(tw_dev->command_packet_virt[request_id], &(tw_ioctl->firmware_command), sizeof(TW_Command_Full));
708 /* Now post the command packet to the controller */
709 twa_post_command_packet(tw_dev, request_id, 1);
710 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
712 timeout = TW_IOCTL_CHRDEV_TIMEOUT*HZ;
714 /* Now wait for command to complete */
715 timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout);
717 /* We timed out, and didn't get an interrupt */
718 if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) {
719 /* Now we need to reset the board */
720 printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Character ioctl (0x%x) timed out, resetting card.\n",
721 tw_dev->host->host_no, TW_DRIVER, 0x37,
722 cmd);
723 retval = TW_IOCTL_ERROR_OS_EIO;
724 twa_reset_device_extension(tw_dev);
725 goto out3;
728 /* Now copy in the command packet response */
729 memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virt[request_id], sizeof(TW_Command_Full));
731 /* Now complete the io */
732 spin_lock_irqsave(tw_dev->host->host_lock, flags);
733 tw_dev->posted_request_count--;
734 tw_dev->state[request_id] = TW_S_COMPLETED;
735 twa_free_request_id(tw_dev, request_id);
736 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
737 break;
738 case TW_IOCTL_GET_COMPATIBILITY_INFO:
739 tw_ioctl->driver_command.status = 0;
740 /* Copy compatibility struct into ioctl data buffer */
741 tw_compat_info = (TW_Compatibility_Info *)tw_ioctl->data_buffer;
742 memcpy(tw_compat_info, &tw_dev->tw_compat_info, sizeof(TW_Compatibility_Info));
743 break;
744 case TW_IOCTL_GET_LAST_EVENT:
745 if (tw_dev->event_queue_wrapped) {
746 if (tw_dev->aen_clobber) {
747 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
748 tw_dev->aen_clobber = 0;
749 } else
750 tw_ioctl->driver_command.status = 0;
751 } else {
752 if (!tw_dev->error_index) {
753 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
754 break;
756 tw_ioctl->driver_command.status = 0;
758 event_index = (tw_dev->error_index - 1 + TW_Q_LENGTH) % TW_Q_LENGTH;
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_FIRST_EVENT:
763 if (tw_dev->event_queue_wrapped) {
764 if (tw_dev->aen_clobber) {
765 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
766 tw_dev->aen_clobber = 0;
767 } else
768 tw_ioctl->driver_command.status = 0;
769 event_index = tw_dev->error_index;
770 } else {
771 if (!tw_dev->error_index) {
772 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
773 break;
775 tw_ioctl->driver_command.status = 0;
776 event_index = 0;
778 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
779 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
780 break;
781 case TW_IOCTL_GET_NEXT_EVENT:
782 event = (TW_Event *)tw_ioctl->data_buffer;
783 sequence_id = event->sequence_id;
784 tw_ioctl->driver_command.status = 0;
786 if (tw_dev->event_queue_wrapped) {
787 if (tw_dev->aen_clobber) {
788 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
789 tw_dev->aen_clobber = 0;
791 start_index = tw_dev->error_index;
792 } else {
793 if (!tw_dev->error_index) {
794 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
795 break;
797 start_index = 0;
799 event_index = (start_index + sequence_id - tw_dev->event_queue[start_index]->sequence_id + 1) % TW_Q_LENGTH;
801 if (!(tw_dev->event_queue[event_index]->sequence_id > sequence_id)) {
802 if (tw_ioctl->driver_command.status == TW_IOCTL_ERROR_STATUS_AEN_CLOBBER)
803 tw_dev->aen_clobber = 1;
804 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
805 break;
807 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
808 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
809 break;
810 case TW_IOCTL_GET_PREVIOUS_EVENT:
811 event = (TW_Event *)tw_ioctl->data_buffer;
812 sequence_id = event->sequence_id;
813 tw_ioctl->driver_command.status = 0;
815 if (tw_dev->event_queue_wrapped) {
816 if (tw_dev->aen_clobber) {
817 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_AEN_CLOBBER;
818 tw_dev->aen_clobber = 0;
820 start_index = tw_dev->error_index;
821 } else {
822 if (!tw_dev->error_index) {
823 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
824 break;
826 start_index = 0;
828 event_index = (start_index + sequence_id - tw_dev->event_queue[start_index]->sequence_id - 1) % TW_Q_LENGTH;
830 if (!(tw_dev->event_queue[event_index]->sequence_id < sequence_id)) {
831 if (tw_ioctl->driver_command.status == TW_IOCTL_ERROR_STATUS_AEN_CLOBBER)
832 tw_dev->aen_clobber = 1;
833 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NO_MORE_EVENTS;
834 break;
836 memcpy(tw_ioctl->data_buffer, tw_dev->event_queue[event_index], sizeof(TW_Event));
837 tw_dev->event_queue[event_index]->retrieved = TW_AEN_RETRIEVED;
838 break;
839 case TW_IOCTL_GET_LOCK:
840 tw_lock = (TW_Lock *)tw_ioctl->data_buffer;
841 do_gettimeofday(&current_time);
842 current_time_ms = (current_time.tv_sec * 1000) + (current_time.tv_usec / 1000);
844 if ((tw_lock->force_flag == 1) || (tw_dev->ioctl_sem_lock == 0) || (current_time_ms >= tw_dev->ioctl_msec)) {
845 tw_dev->ioctl_sem_lock = 1;
846 tw_dev->ioctl_msec = current_time_ms + tw_lock->timeout_msec;
847 tw_ioctl->driver_command.status = 0;
848 tw_lock->time_remaining_msec = tw_lock->timeout_msec;
849 } else {
850 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_LOCKED;
851 tw_lock->time_remaining_msec = tw_dev->ioctl_msec - current_time_ms;
853 break;
854 case TW_IOCTL_RELEASE_LOCK:
855 if (tw_dev->ioctl_sem_lock == 1) {
856 tw_dev->ioctl_sem_lock = 0;
857 tw_ioctl->driver_command.status = 0;
858 } else {
859 tw_ioctl->driver_command.status = TW_IOCTL_ERROR_STATUS_NOT_LOCKED;
861 break;
862 default:
863 retval = TW_IOCTL_ERROR_OS_ENOTTY;
864 goto out3;
867 /* Now copy the entire response to userspace */
868 if (copy_to_user(argp, tw_ioctl, sizeof(TW_Ioctl_Buf_Apache) + driver_command.buffer_length - 1) == 0)
869 retval = 0;
870 out3:
871 /* Now free ioctl buf memory */
872 dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, cpu_addr, dma_handle);
873 out2:
874 mutex_unlock(&tw_dev->ioctl_lock);
875 out:
876 return retval;
877 } /* End twa_chrdev_ioctl() */
879 /* This function handles open for the character device */
880 /* NOTE that this function will race with remove. */
881 static int twa_chrdev_open(struct inode *inode, struct file *file)
883 unsigned int minor_number;
884 int retval = TW_IOCTL_ERROR_OS_ENODEV;
886 cycle_kernel_lock();
887 minor_number = iminor(inode);
888 if (minor_number >= twa_device_extension_count)
889 goto out;
890 retval = 0;
891 out:
892 return retval;
893 } /* End twa_chrdev_open() */
895 /* This function will print readable messages from status register errors */
896 static int twa_decode_bits(TW_Device_Extension *tw_dev, u32 status_reg_value)
898 int retval = 1;
900 /* Check for various error conditions and handle them appropriately */
901 if (status_reg_value & TW_STATUS_PCI_PARITY_ERROR) {
902 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xc, "PCI Parity Error: clearing");
903 writel(TW_CONTROL_CLEAR_PARITY_ERROR, TW_CONTROL_REG_ADDR(tw_dev));
906 if (status_reg_value & TW_STATUS_PCI_ABORT) {
907 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xd, "PCI Abort: clearing");
908 writel(TW_CONTROL_CLEAR_PCI_ABORT, TW_CONTROL_REG_ADDR(tw_dev));
909 pci_write_config_word(tw_dev->tw_pci_dev, PCI_STATUS, TW_PCI_CLEAR_PCI_ABORT);
912 if (status_reg_value & TW_STATUS_QUEUE_ERROR) {
913 if (((tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9650SE) &&
914 (tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9690SA)) ||
915 (!test_bit(TW_IN_RESET, &tw_dev->flags)))
916 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Controller Queue Error: clearing");
917 writel(TW_CONTROL_CLEAR_QUEUE_ERROR, TW_CONTROL_REG_ADDR(tw_dev));
920 if (status_reg_value & TW_STATUS_MICROCONTROLLER_ERROR) {
921 if (tw_dev->reset_print == 0) {
922 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x10, "Microcontroller Error: clearing");
923 tw_dev->reset_print = 1;
925 goto out;
927 retval = 0;
928 out:
929 return retval;
930 } /* End twa_decode_bits() */
932 /* This function will empty the response queue */
933 static int twa_empty_response_queue(TW_Device_Extension *tw_dev)
935 u32 status_reg_value, response_que_value;
936 int count = 0, retval = 1;
938 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
940 while (((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) && (count < TW_MAX_RESPONSE_DRAIN)) {
941 response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
942 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
943 count++;
945 if (count == TW_MAX_RESPONSE_DRAIN)
946 goto out;
948 retval = 0;
949 out:
950 return retval;
951 } /* End twa_empty_response_queue() */
953 /* This function will clear the pchip/response queue on 9550SX */
954 static int twa_empty_response_queue_large(TW_Device_Extension *tw_dev)
956 u32 response_que_value = 0;
957 unsigned long before;
958 int retval = 1;
960 if (tw_dev->tw_pci_dev->device != PCI_DEVICE_ID_3WARE_9000) {
961 before = jiffies;
962 while ((response_que_value & TW_9550SX_DRAIN_COMPLETED) != TW_9550SX_DRAIN_COMPLETED) {
963 response_que_value = readl(TW_RESPONSE_QUEUE_REG_ADDR_LARGE(tw_dev));
964 msleep(1);
965 if (time_after(jiffies, before + HZ * 30))
966 goto out;
968 /* P-chip settle time */
969 msleep(500);
970 retval = 0;
971 } else
972 retval = 0;
973 out:
974 return retval;
975 } /* End twa_empty_response_queue_large() */
977 /* This function passes sense keys from firmware to scsi layer */
978 static int twa_fill_sense(TW_Device_Extension *tw_dev, int request_id, int copy_sense, int print_host)
980 TW_Command_Full *full_command_packet;
981 unsigned short error;
982 int retval = 1;
983 char *error_str;
985 full_command_packet = tw_dev->command_packet_virt[request_id];
987 /* Check for embedded error string */
988 error_str = &(full_command_packet->header.err_specific_desc[strlen(full_command_packet->header.err_specific_desc) + 1]);
990 /* Don't print error for Logical unit not supported during rollcall */
991 error = le16_to_cpu(full_command_packet->header.status_block.error);
992 if ((error != TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED) && (error != TW_ERROR_UNIT_OFFLINE)) {
993 if (print_host)
994 printk(KERN_WARNING "3w-9xxx: scsi%d: ERROR: (0x%02X:0x%04X): %s:%s.\n",
995 tw_dev->host->host_no,
996 TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
997 full_command_packet->header.status_block.error,
998 error_str[0] == '\0' ?
999 twa_string_lookup(twa_error_table,
1000 full_command_packet->header.status_block.error) : error_str,
1001 full_command_packet->header.err_specific_desc);
1002 else
1003 printk(KERN_WARNING "3w-9xxx: ERROR: (0x%02X:0x%04X): %s:%s.\n",
1004 TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
1005 full_command_packet->header.status_block.error,
1006 error_str[0] == '\0' ?
1007 twa_string_lookup(twa_error_table,
1008 full_command_packet->header.status_block.error) : error_str,
1009 full_command_packet->header.err_specific_desc);
1012 if (copy_sense) {
1013 memcpy(tw_dev->srb[request_id]->sense_buffer, full_command_packet->header.sense_data, TW_SENSE_DATA_LENGTH);
1014 tw_dev->srb[request_id]->result = (full_command_packet->command.newcommand.status << 1);
1015 retval = TW_ISR_DONT_RESULT;
1016 goto out;
1018 retval = 0;
1019 out:
1020 return retval;
1021 } /* End twa_fill_sense() */
1023 /* This function will free up device extension resources */
1024 static void twa_free_device_extension(TW_Device_Extension *tw_dev)
1026 if (tw_dev->command_packet_virt[0])
1027 pci_free_consistent(tw_dev->tw_pci_dev,
1028 sizeof(TW_Command_Full)*TW_Q_LENGTH,
1029 tw_dev->command_packet_virt[0],
1030 tw_dev->command_packet_phys[0]);
1032 if (tw_dev->generic_buffer_virt[0])
1033 pci_free_consistent(tw_dev->tw_pci_dev,
1034 TW_SECTOR_SIZE*TW_Q_LENGTH,
1035 tw_dev->generic_buffer_virt[0],
1036 tw_dev->generic_buffer_phys[0]);
1038 kfree(tw_dev->event_queue[0]);
1039 } /* End twa_free_device_extension() */
1041 /* This function will free a request id */
1042 static void twa_free_request_id(TW_Device_Extension *tw_dev, int request_id)
1044 tw_dev->free_queue[tw_dev->free_tail] = request_id;
1045 tw_dev->state[request_id] = TW_S_FINISHED;
1046 tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH;
1047 } /* End twa_free_request_id() */
1049 /* This function will get parameter table entries from the firmware */
1050 static void *twa_get_param(TW_Device_Extension *tw_dev, int request_id, int table_id, int parameter_id, int parameter_size_bytes)
1052 TW_Command_Full *full_command_packet;
1053 TW_Command *command_packet;
1054 TW_Param_Apache *param;
1055 void *retval = NULL;
1057 /* Setup the command packet */
1058 full_command_packet = tw_dev->command_packet_virt[request_id];
1059 memset(full_command_packet, 0, sizeof(TW_Command_Full));
1060 command_packet = &full_command_packet->command.oldcommand;
1062 command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM);
1063 command_packet->size = TW_COMMAND_SIZE;
1064 command_packet->request_id = request_id;
1065 command_packet->byte6_offset.block_count = cpu_to_le16(1);
1067 /* Now setup the param */
1068 param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
1069 memset(param, 0, TW_SECTOR_SIZE);
1070 param->table_id = cpu_to_le16(table_id | 0x8000);
1071 param->parameter_id = cpu_to_le16(parameter_id);
1072 param->parameter_size_bytes = cpu_to_le16(parameter_size_bytes);
1074 command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
1075 command_packet->byte8_offset.param.sgl[0].length = cpu_to_le32(TW_SECTOR_SIZE);
1077 /* Post the command packet to the board */
1078 twa_post_command_packet(tw_dev, request_id, 1);
1080 /* Poll for completion */
1081 if (twa_poll_response(tw_dev, request_id, 30))
1082 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x13, "No valid response during get param")
1083 else
1084 retval = (void *)&(param->data[0]);
1086 tw_dev->posted_request_count--;
1087 tw_dev->state[request_id] = TW_S_INITIAL;
1089 return retval;
1090 } /* End twa_get_param() */
1092 /* This function will assign an available request id */
1093 static void twa_get_request_id(TW_Device_Extension *tw_dev, int *request_id)
1095 *request_id = tw_dev->free_queue[tw_dev->free_head];
1096 tw_dev->free_head = (tw_dev->free_head + 1) % TW_Q_LENGTH;
1097 tw_dev->state[*request_id] = TW_S_STARTED;
1098 } /* End twa_get_request_id() */
1100 /* This function will send an initconnection command to controller */
1101 static int twa_initconnection(TW_Device_Extension *tw_dev, int message_credits,
1102 u32 set_features, unsigned short current_fw_srl,
1103 unsigned short current_fw_arch_id,
1104 unsigned short current_fw_branch,
1105 unsigned short current_fw_build,
1106 unsigned short *fw_on_ctlr_srl,
1107 unsigned short *fw_on_ctlr_arch_id,
1108 unsigned short *fw_on_ctlr_branch,
1109 unsigned short *fw_on_ctlr_build,
1110 u32 *init_connect_result)
1112 TW_Command_Full *full_command_packet;
1113 TW_Initconnect *tw_initconnect;
1114 int request_id = 0, retval = 1;
1116 /* Initialize InitConnection command packet */
1117 full_command_packet = tw_dev->command_packet_virt[request_id];
1118 memset(full_command_packet, 0, sizeof(TW_Command_Full));
1119 full_command_packet->header.header_desc.size_header = 128;
1121 tw_initconnect = (TW_Initconnect *)&full_command_packet->command.oldcommand;
1122 tw_initconnect->opcode__reserved = TW_OPRES_IN(0, TW_OP_INIT_CONNECTION);
1123 tw_initconnect->request_id = request_id;
1124 tw_initconnect->message_credits = cpu_to_le16(message_credits);
1125 tw_initconnect->features = set_features;
1127 /* Turn on 64-bit sgl support if we need to */
1128 tw_initconnect->features |= sizeof(dma_addr_t) > 4 ? 1 : 0;
1130 tw_initconnect->features = cpu_to_le32(tw_initconnect->features);
1132 if (set_features & TW_EXTENDED_INIT_CONNECT) {
1133 tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE_EXTENDED;
1134 tw_initconnect->fw_srl = cpu_to_le16(current_fw_srl);
1135 tw_initconnect->fw_arch_id = cpu_to_le16(current_fw_arch_id);
1136 tw_initconnect->fw_branch = cpu_to_le16(current_fw_branch);
1137 tw_initconnect->fw_build = cpu_to_le16(current_fw_build);
1138 } else
1139 tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE;
1141 /* Send command packet to the board */
1142 twa_post_command_packet(tw_dev, request_id, 1);
1144 /* Poll for completion */
1145 if (twa_poll_response(tw_dev, request_id, 30)) {
1146 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x15, "No valid response during init connection");
1147 } else {
1148 if (set_features & TW_EXTENDED_INIT_CONNECT) {
1149 *fw_on_ctlr_srl = le16_to_cpu(tw_initconnect->fw_srl);
1150 *fw_on_ctlr_arch_id = le16_to_cpu(tw_initconnect->fw_arch_id);
1151 *fw_on_ctlr_branch = le16_to_cpu(tw_initconnect->fw_branch);
1152 *fw_on_ctlr_build = le16_to_cpu(tw_initconnect->fw_build);
1153 *init_connect_result = le32_to_cpu(tw_initconnect->result);
1155 retval = 0;
1158 tw_dev->posted_request_count--;
1159 tw_dev->state[request_id] = TW_S_INITIAL;
1161 return retval;
1162 } /* End twa_initconnection() */
1164 /* This function will initialize the fields of a device extension */
1165 static int twa_initialize_device_extension(TW_Device_Extension *tw_dev)
1167 int i, retval = 1;
1169 /* Initialize command packet buffers */
1170 if (twa_allocate_memory(tw_dev, sizeof(TW_Command_Full), 0)) {
1171 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x16, "Command packet memory allocation failed");
1172 goto out;
1175 /* Initialize generic buffer */
1176 if (twa_allocate_memory(tw_dev, TW_SECTOR_SIZE, 1)) {
1177 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x17, "Generic memory allocation failed");
1178 goto out;
1181 /* Allocate event info space */
1182 tw_dev->event_queue[0] = kcalloc(TW_Q_LENGTH, sizeof(TW_Event), GFP_KERNEL);
1183 if (!tw_dev->event_queue[0]) {
1184 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x18, "Event info memory allocation failed");
1185 goto out;
1189 for (i = 0; i < TW_Q_LENGTH; i++) {
1190 tw_dev->event_queue[i] = (TW_Event *)((unsigned char *)tw_dev->event_queue[0] + (i * sizeof(TW_Event)));
1191 tw_dev->free_queue[i] = i;
1192 tw_dev->state[i] = TW_S_INITIAL;
1195 tw_dev->pending_head = TW_Q_START;
1196 tw_dev->pending_tail = TW_Q_START;
1197 tw_dev->free_head = TW_Q_START;
1198 tw_dev->free_tail = TW_Q_START;
1199 tw_dev->error_sequence_id = 1;
1200 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1202 mutex_init(&tw_dev->ioctl_lock);
1203 init_waitqueue_head(&tw_dev->ioctl_wqueue);
1205 retval = 0;
1206 out:
1207 return retval;
1208 } /* End twa_initialize_device_extension() */
1210 /* This function is the interrupt service routine */
1211 static irqreturn_t twa_interrupt(int irq, void *dev_instance)
1213 int request_id, error = 0;
1214 u32 status_reg_value;
1215 TW_Response_Queue response_que;
1216 TW_Command_Full *full_command_packet;
1217 TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance;
1218 int handled = 0;
1220 /* Get the per adapter lock */
1221 spin_lock(tw_dev->host->host_lock);
1223 /* Read the registers */
1224 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1226 /* Check if this is our interrupt, otherwise bail */
1227 if (!(status_reg_value & TW_STATUS_VALID_INTERRUPT))
1228 goto twa_interrupt_bail;
1230 handled = 1;
1232 /* If we are resetting, bail */
1233 if (test_bit(TW_IN_RESET, &tw_dev->flags))
1234 goto twa_interrupt_bail;
1236 /* Check controller for errors */
1237 if (twa_check_bits(status_reg_value)) {
1238 if (twa_decode_bits(tw_dev, status_reg_value)) {
1239 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1240 goto twa_interrupt_bail;
1244 /* Handle host interrupt */
1245 if (status_reg_value & TW_STATUS_HOST_INTERRUPT)
1246 TW_CLEAR_HOST_INTERRUPT(tw_dev);
1248 /* Handle attention interrupt */
1249 if (status_reg_value & TW_STATUS_ATTENTION_INTERRUPT) {
1250 TW_CLEAR_ATTENTION_INTERRUPT(tw_dev);
1251 if (!(test_and_set_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags))) {
1252 twa_get_request_id(tw_dev, &request_id);
1254 error = twa_aen_read_queue(tw_dev, request_id);
1255 if (error) {
1256 tw_dev->state[request_id] = TW_S_COMPLETED;
1257 twa_free_request_id(tw_dev, request_id);
1258 clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
1263 /* Handle command interrupt */
1264 if (status_reg_value & TW_STATUS_COMMAND_INTERRUPT) {
1265 TW_MASK_COMMAND_INTERRUPT(tw_dev);
1266 /* Drain as many pending commands as we can */
1267 while (tw_dev->pending_request_count > 0) {
1268 request_id = tw_dev->pending_queue[tw_dev->pending_head];
1269 if (tw_dev->state[request_id] != TW_S_PENDING) {
1270 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x19, "Found request id that wasn't pending");
1271 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1272 goto twa_interrupt_bail;
1274 if (twa_post_command_packet(tw_dev, request_id, 1)==0) {
1275 tw_dev->pending_head = (tw_dev->pending_head + 1) % TW_Q_LENGTH;
1276 tw_dev->pending_request_count--;
1277 } else {
1278 /* If we get here, we will continue re-posting on the next command interrupt */
1279 break;
1284 /* Handle response interrupt */
1285 if (status_reg_value & TW_STATUS_RESPONSE_INTERRUPT) {
1287 /* Drain the response queue from the board */
1288 while ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) {
1289 /* Complete the response */
1290 response_que.value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
1291 request_id = TW_RESID_OUT(response_que.response_id);
1292 full_command_packet = tw_dev->command_packet_virt[request_id];
1293 error = 0;
1294 /* Check for command packet errors */
1295 if (full_command_packet->command.newcommand.status != 0) {
1296 if (tw_dev->srb[request_id] != NULL) {
1297 error = twa_fill_sense(tw_dev, request_id, 1, 1);
1298 } else {
1299 /* Skip ioctl error prints */
1300 if (request_id != tw_dev->chrdev_request_id) {
1301 error = twa_fill_sense(tw_dev, request_id, 0, 1);
1306 /* Check for correct state */
1307 if (tw_dev->state[request_id] != TW_S_POSTED) {
1308 if (tw_dev->srb[request_id] != NULL) {
1309 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1a, "Received a request id that wasn't posted");
1310 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1311 goto twa_interrupt_bail;
1315 /* Check for internal command completion */
1316 if (tw_dev->srb[request_id] == NULL) {
1317 if (request_id != tw_dev->chrdev_request_id) {
1318 if (twa_aen_complete(tw_dev, request_id))
1319 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1b, "Error completing AEN during attention interrupt");
1320 } else {
1321 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1322 wake_up(&tw_dev->ioctl_wqueue);
1324 } else {
1325 struct scsi_cmnd *cmd;
1327 cmd = tw_dev->srb[request_id];
1329 twa_scsiop_execute_scsi_complete(tw_dev, request_id);
1330 /* If no error command was a success */
1331 if (error == 0) {
1332 cmd->result = (DID_OK << 16);
1335 /* If error, command failed */
1336 if (error == 1) {
1337 /* Ask for a host reset */
1338 cmd->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
1341 /* Report residual bytes for single sgl */
1342 if ((scsi_sg_count(cmd) <= 1) && (full_command_packet->command.newcommand.status == 0)) {
1343 if (full_command_packet->command.newcommand.sg_list[0].length < scsi_bufflen(tw_dev->srb[request_id]))
1344 scsi_set_resid(cmd, scsi_bufflen(cmd) - full_command_packet->command.newcommand.sg_list[0].length);
1347 /* Now complete the io */
1348 tw_dev->state[request_id] = TW_S_COMPLETED;
1349 twa_free_request_id(tw_dev, request_id);
1350 tw_dev->posted_request_count--;
1351 tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
1352 twa_unmap_scsi_data(tw_dev, request_id);
1355 /* Check for valid status after each drain */
1356 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1357 if (twa_check_bits(status_reg_value)) {
1358 if (twa_decode_bits(tw_dev, status_reg_value)) {
1359 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1360 goto twa_interrupt_bail;
1366 twa_interrupt_bail:
1367 spin_unlock(tw_dev->host->host_lock);
1368 return IRQ_RETVAL(handled);
1369 } /* End twa_interrupt() */
1371 /* This function will load the request id and various sgls for ioctls */
1372 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)
1374 TW_Command *oldcommand;
1375 TW_Command_Apache *newcommand;
1376 TW_SG_Entry *sgl;
1377 unsigned int pae = 0;
1379 if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4))
1380 pae = 1;
1382 if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
1383 newcommand = &full_command_packet->command.newcommand;
1384 newcommand->request_id__lunl =
1385 cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id));
1386 if (length) {
1387 newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
1388 newcommand->sg_list[0].length = cpu_to_le32(length);
1390 newcommand->sgl_entries__lunh =
1391 cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), length ? 1 : 0));
1392 } else {
1393 oldcommand = &full_command_packet->command.oldcommand;
1394 oldcommand->request_id = request_id;
1396 if (TW_SGL_OUT(oldcommand->opcode__sgloffset)) {
1397 /* Load the sg list */
1398 if (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9690SA)
1399 sgl = (TW_SG_Entry *)((u32 *)oldcommand+oldcommand->size - (sizeof(TW_SG_Entry)/4) + pae);
1400 else
1401 sgl = (TW_SG_Entry *)((u32 *)oldcommand+TW_SGL_OUT(oldcommand->opcode__sgloffset));
1402 sgl->address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
1403 sgl->length = cpu_to_le32(length);
1405 oldcommand->size += pae;
1408 } /* End twa_load_sgl() */
1410 /* This function will perform a pci-dma mapping for a scatter gather list */
1411 static int twa_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id)
1413 int use_sg;
1414 struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1416 use_sg = scsi_dma_map(cmd);
1417 if (!use_sg)
1418 return 0;
1419 else if (use_sg < 0) {
1420 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter gather list");
1421 return 0;
1424 cmd->SCp.phase = TW_PHASE_SGLIST;
1425 cmd->SCp.have_data_in = use_sg;
1427 return use_sg;
1428 } /* End twa_map_scsi_sg_data() */
1430 /* This function will poll for a response interrupt of a request */
1431 static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds)
1433 int retval = 1, found = 0, response_request_id;
1434 TW_Response_Queue response_queue;
1435 TW_Command_Full *full_command_packet = tw_dev->command_packet_virt[request_id];
1437 if (twa_poll_status_gone(tw_dev, TW_STATUS_RESPONSE_QUEUE_EMPTY, seconds) == 0) {
1438 response_queue.value = readl(TW_RESPONSE_QUEUE_REG_ADDR(tw_dev));
1439 response_request_id = TW_RESID_OUT(response_queue.response_id);
1440 if (request_id != response_request_id) {
1441 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1e, "Found unexpected request id while polling for response");
1442 goto out;
1444 if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
1445 if (full_command_packet->command.newcommand.status != 0) {
1446 /* bad response */
1447 twa_fill_sense(tw_dev, request_id, 0, 0);
1448 goto out;
1450 found = 1;
1451 } else {
1452 if (full_command_packet->command.oldcommand.status != 0) {
1453 /* bad response */
1454 twa_fill_sense(tw_dev, request_id, 0, 0);
1455 goto out;
1457 found = 1;
1461 if (found)
1462 retval = 0;
1463 out:
1464 return retval;
1465 } /* End twa_poll_response() */
1467 /* This function will poll the status register for a flag */
1468 static int twa_poll_status(TW_Device_Extension *tw_dev, u32 flag, int seconds)
1470 u32 status_reg_value;
1471 unsigned long before;
1472 int retval = 1;
1474 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1475 before = jiffies;
1477 if (twa_check_bits(status_reg_value))
1478 twa_decode_bits(tw_dev, status_reg_value);
1480 while ((status_reg_value & flag) != flag) {
1481 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1483 if (twa_check_bits(status_reg_value))
1484 twa_decode_bits(tw_dev, status_reg_value);
1486 if (time_after(jiffies, before + HZ * seconds))
1487 goto out;
1489 msleep(50);
1491 retval = 0;
1492 out:
1493 return retval;
1494 } /* End twa_poll_status() */
1496 /* This function will poll the status register for disappearance of a flag */
1497 static int twa_poll_status_gone(TW_Device_Extension *tw_dev, u32 flag, int seconds)
1499 u32 status_reg_value;
1500 unsigned long before;
1501 int retval = 1;
1503 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1504 before = jiffies;
1506 if (twa_check_bits(status_reg_value))
1507 twa_decode_bits(tw_dev, status_reg_value);
1509 while ((status_reg_value & flag) != 0) {
1510 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1511 if (twa_check_bits(status_reg_value))
1512 twa_decode_bits(tw_dev, status_reg_value);
1514 if (time_after(jiffies, before + HZ * seconds))
1515 goto out;
1517 msleep(50);
1519 retval = 0;
1520 out:
1521 return retval;
1522 } /* End twa_poll_status_gone() */
1524 /* This function will attempt to post a command packet to the board */
1525 static int twa_post_command_packet(TW_Device_Extension *tw_dev, int request_id, char internal)
1527 u32 status_reg_value;
1528 dma_addr_t command_que_value;
1529 int retval = 1;
1531 command_que_value = tw_dev->command_packet_phys[request_id];
1533 /* For 9650SE write low 4 bytes first */
1534 if ((tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) ||
1535 (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9690SA)) {
1536 command_que_value += TW_COMMAND_OFFSET;
1537 writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev));
1540 status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
1542 if (twa_check_bits(status_reg_value))
1543 twa_decode_bits(tw_dev, status_reg_value);
1545 if (((tw_dev->pending_request_count > 0) && (tw_dev->state[request_id] != TW_S_PENDING)) || (status_reg_value & TW_STATUS_COMMAND_QUEUE_FULL)) {
1547 /* Only pend internal driver commands */
1548 if (!internal) {
1549 retval = SCSI_MLQUEUE_HOST_BUSY;
1550 goto out;
1553 /* Couldn't post the command packet, so we do it later */
1554 if (tw_dev->state[request_id] != TW_S_PENDING) {
1555 tw_dev->state[request_id] = TW_S_PENDING;
1556 tw_dev->pending_request_count++;
1557 if (tw_dev->pending_request_count > tw_dev->max_pending_request_count) {
1558 tw_dev->max_pending_request_count = tw_dev->pending_request_count;
1560 tw_dev->pending_queue[tw_dev->pending_tail] = request_id;
1561 tw_dev->pending_tail = (tw_dev->pending_tail + 1) % TW_Q_LENGTH;
1563 TW_UNMASK_COMMAND_INTERRUPT(tw_dev);
1564 goto out;
1565 } else {
1566 if ((tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9650SE) ||
1567 (tw_dev->tw_pci_dev->device == PCI_DEVICE_ID_3WARE_9690SA)) {
1568 /* Now write upper 4 bytes */
1569 writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR_LARGE(tw_dev) + 0x4);
1570 } else {
1571 if (sizeof(dma_addr_t) > 4) {
1572 command_que_value += TW_COMMAND_OFFSET;
1573 writel((u32)command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
1574 writel((u32)((u64)command_que_value >> 32), TW_COMMAND_QUEUE_REG_ADDR(tw_dev) + 0x4);
1575 } else {
1576 writel(TW_COMMAND_OFFSET + command_que_value, TW_COMMAND_QUEUE_REG_ADDR(tw_dev));
1579 tw_dev->state[request_id] = TW_S_POSTED;
1580 tw_dev->posted_request_count++;
1581 if (tw_dev->posted_request_count > tw_dev->max_posted_request_count) {
1582 tw_dev->max_posted_request_count = tw_dev->posted_request_count;
1585 retval = 0;
1586 out:
1587 return retval;
1588 } /* End twa_post_command_packet() */
1590 /* This function will reset a device extension */
1591 static int twa_reset_device_extension(TW_Device_Extension *tw_dev)
1593 int i = 0;
1594 int retval = 1;
1595 unsigned long flags = 0;
1597 set_bit(TW_IN_RESET, &tw_dev->flags);
1598 TW_DISABLE_INTERRUPTS(tw_dev);
1599 TW_MASK_COMMAND_INTERRUPT(tw_dev);
1600 spin_lock_irqsave(tw_dev->host->host_lock, flags);
1602 /* Abort all requests that are in progress */
1603 for (i = 0; i < TW_Q_LENGTH; i++) {
1604 if ((tw_dev->state[i] != TW_S_FINISHED) &&
1605 (tw_dev->state[i] != TW_S_INITIAL) &&
1606 (tw_dev->state[i] != TW_S_COMPLETED)) {
1607 if (tw_dev->srb[i]) {
1608 tw_dev->srb[i]->result = (DID_RESET << 16);
1609 tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
1610 twa_unmap_scsi_data(tw_dev, i);
1615 /* Reset queues and counts */
1616 for (i = 0; i < TW_Q_LENGTH; i++) {
1617 tw_dev->free_queue[i] = i;
1618 tw_dev->state[i] = TW_S_INITIAL;
1620 tw_dev->free_head = TW_Q_START;
1621 tw_dev->free_tail = TW_Q_START;
1622 tw_dev->posted_request_count = 0;
1623 tw_dev->pending_request_count = 0;
1624 tw_dev->pending_head = TW_Q_START;
1625 tw_dev->pending_tail = TW_Q_START;
1626 tw_dev->reset_print = 0;
1628 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
1630 if (twa_reset_sequence(tw_dev, 1))
1631 goto out;
1633 TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
1634 clear_bit(TW_IN_RESET, &tw_dev->flags);
1635 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1637 retval = 0;
1638 out:
1639 return retval;
1640 } /* End twa_reset_device_extension() */
1642 /* This function will reset a controller */
1643 static int twa_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset)
1645 int tries = 0, retval = 1, flashed = 0, do_soft_reset = soft_reset;
1647 while (tries < TW_MAX_RESET_TRIES) {
1648 if (do_soft_reset) {
1649 TW_SOFT_RESET(tw_dev);
1650 /* Clear pchip/response queue on 9550SX */
1651 if (twa_empty_response_queue_large(tw_dev)) {
1652 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x36, "Response queue (large) empty failed during reset sequence");
1653 do_soft_reset = 1;
1654 tries++;
1655 continue;
1659 /* Make sure controller is in a good state */
1660 if (twa_poll_status(tw_dev, TW_STATUS_MICROCONTROLLER_READY | (do_soft_reset == 1 ? TW_STATUS_ATTENTION_INTERRUPT : 0), 60)) {
1661 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1f, "Microcontroller not ready during reset sequence");
1662 do_soft_reset = 1;
1663 tries++;
1664 continue;
1667 /* Empty response queue */
1668 if (twa_empty_response_queue(tw_dev)) {
1669 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x20, "Response queue empty failed during reset sequence");
1670 do_soft_reset = 1;
1671 tries++;
1672 continue;
1675 flashed = 0;
1677 /* Check for compatibility/flash */
1678 if (twa_check_srl(tw_dev, &flashed)) {
1679 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x21, "Compatibility check failed during reset sequence");
1680 do_soft_reset = 1;
1681 tries++;
1682 continue;
1683 } else {
1684 if (flashed) {
1685 tries++;
1686 continue;
1690 /* Drain the AEN queue */
1691 if (twa_aen_drain_queue(tw_dev, soft_reset)) {
1692 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x22, "AEN drain failed during reset sequence");
1693 do_soft_reset = 1;
1694 tries++;
1695 continue;
1698 /* If we got here, controller is in a good state */
1699 retval = 0;
1700 goto out;
1702 out:
1703 return retval;
1704 } /* End twa_reset_sequence() */
1706 /* This funciton returns unit geometry in cylinders/heads/sectors */
1707 static int twa_scsi_biosparam(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int geom[])
1709 int heads, sectors, cylinders;
1710 TW_Device_Extension *tw_dev;
1712 tw_dev = (TW_Device_Extension *)sdev->host->hostdata;
1714 if (capacity >= 0x200000) {
1715 heads = 255;
1716 sectors = 63;
1717 cylinders = sector_div(capacity, heads * sectors);
1718 } else {
1719 heads = 64;
1720 sectors = 32;
1721 cylinders = sector_div(capacity, heads * sectors);
1724 geom[0] = heads;
1725 geom[1] = sectors;
1726 geom[2] = cylinders;
1728 return 0;
1729 } /* End twa_scsi_biosparam() */
1731 /* This is the new scsi eh reset function */
1732 static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt)
1734 TW_Device_Extension *tw_dev = NULL;
1735 int retval = FAILED;
1737 tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1739 tw_dev->num_resets++;
1741 sdev_printk(KERN_WARNING, SCpnt->device,
1742 "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n",
1743 TW_DRIVER, 0x2c, SCpnt->cmnd[0]);
1745 /* Make sure we are not issuing an ioctl or resetting from ioctl */
1746 mutex_lock(&tw_dev->ioctl_lock);
1748 /* Now reset the card and some of the device extension data */
1749 if (twa_reset_device_extension(tw_dev)) {
1750 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2b, "Controller reset failed during scsi host reset");
1751 goto out;
1754 retval = SUCCESS;
1755 out:
1756 mutex_unlock(&tw_dev->ioctl_lock);
1757 return retval;
1758 } /* End twa_scsi_eh_reset() */
1760 /* This is the main scsi queue function to handle scsi opcodes */
1761 static int twa_scsi_queue(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
1763 int request_id, retval;
1764 TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1766 /* If we are resetting due to timed out ioctl, report as busy */
1767 if (test_bit(TW_IN_RESET, &tw_dev->flags)) {
1768 retval = SCSI_MLQUEUE_HOST_BUSY;
1769 goto out;
1772 /* Check if this FW supports luns */
1773 if ((SCpnt->device->lun != 0) && (tw_dev->tw_compat_info.working_srl < TW_FW_SRL_LUNS_SUPPORTED)) {
1774 SCpnt->result = (DID_BAD_TARGET << 16);
1775 done(SCpnt);
1776 retval = 0;
1777 goto out;
1780 /* Save done function into scsi_cmnd struct */
1781 SCpnt->scsi_done = done;
1783 /* Get a free request id */
1784 twa_get_request_id(tw_dev, &request_id);
1786 /* Save the scsi command for use by the ISR */
1787 tw_dev->srb[request_id] = SCpnt;
1789 /* Initialize phase to zero */
1790 SCpnt->SCp.phase = TW_PHASE_INITIAL;
1792 retval = twa_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL);
1793 switch (retval) {
1794 case SCSI_MLQUEUE_HOST_BUSY:
1795 twa_free_request_id(tw_dev, request_id);
1796 break;
1797 case 1:
1798 tw_dev->state[request_id] = TW_S_COMPLETED;
1799 twa_free_request_id(tw_dev, request_id);
1800 SCpnt->result = (DID_ERROR << 16);
1801 done(SCpnt);
1802 retval = 0;
1804 out:
1805 return retval;
1806 } /* End twa_scsi_queue() */
1808 /* This function hands scsi cdb's to the firmware */
1809 static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg)
1811 TW_Command_Full *full_command_packet;
1812 TW_Command_Apache *command_packet;
1813 u32 num_sectors = 0x0;
1814 int i, sg_count;
1815 struct scsi_cmnd *srb = NULL;
1816 struct scatterlist *sglist = NULL, *sg;
1817 int retval = 1;
1819 if (tw_dev->srb[request_id]) {
1820 srb = tw_dev->srb[request_id];
1821 if (scsi_sglist(srb))
1822 sglist = scsi_sglist(srb);
1825 /* Initialize command packet */
1826 full_command_packet = tw_dev->command_packet_virt[request_id];
1827 full_command_packet->header.header_desc.size_header = 128;
1828 full_command_packet->header.status_block.error = 0;
1829 full_command_packet->header.status_block.severity__reserved = 0;
1831 command_packet = &full_command_packet->command.newcommand;
1832 command_packet->status = 0;
1833 command_packet->opcode__reserved = TW_OPRES_IN(0, TW_OP_EXECUTE_SCSI);
1835 /* We forced 16 byte cdb use earlier */
1836 if (!cdb)
1837 memcpy(command_packet->cdb, srb->cmnd, TW_MAX_CDB_LEN);
1838 else
1839 memcpy(command_packet->cdb, cdb, TW_MAX_CDB_LEN);
1841 if (srb) {
1842 command_packet->unit = srb->device->id;
1843 command_packet->request_id__lunl =
1844 cpu_to_le16(TW_REQ_LUN_IN(srb->device->lun, request_id));
1845 } else {
1846 command_packet->request_id__lunl =
1847 cpu_to_le16(TW_REQ_LUN_IN(0, request_id));
1848 command_packet->unit = 0;
1851 command_packet->sgl_offset = 16;
1853 if (!sglistarg) {
1854 /* Map sglist from scsi layer to cmd packet */
1856 if (scsi_sg_count(srb)) {
1857 if ((scsi_sg_count(srb) == 1) &&
1858 (scsi_bufflen(srb) < TW_MIN_SGL_LENGTH)) {
1859 if (srb->sc_data_direction == DMA_TO_DEVICE ||
1860 srb->sc_data_direction == DMA_BIDIRECTIONAL)
1861 scsi_sg_copy_to_buffer(srb,
1862 tw_dev->generic_buffer_virt[request_id],
1863 TW_SECTOR_SIZE);
1864 command_packet->sg_list[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
1865 command_packet->sg_list[0].length = cpu_to_le32(TW_MIN_SGL_LENGTH);
1866 } else {
1867 sg_count = twa_map_scsi_sg_data(tw_dev, request_id);
1868 if (sg_count == 0)
1869 goto out;
1871 scsi_for_each_sg(srb, sg, sg_count, i) {
1872 command_packet->sg_list[i].address = TW_CPU_TO_SGL(sg_dma_address(sg));
1873 command_packet->sg_list[i].length = cpu_to_le32(sg_dma_len(sg));
1874 if (command_packet->sg_list[i].address & TW_CPU_TO_SGL(TW_ALIGNMENT_9000_SGL)) {
1875 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2e, "Found unaligned sgl address during execute scsi");
1876 goto out;
1880 command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN((srb->device->lun >> 4), scsi_sg_count(tw_dev->srb[request_id])));
1882 } else {
1883 /* Internal cdb post */
1884 for (i = 0; i < use_sg; i++) {
1885 command_packet->sg_list[i].address = TW_CPU_TO_SGL(sglistarg[i].address);
1886 command_packet->sg_list[i].length = cpu_to_le32(sglistarg[i].length);
1887 if (command_packet->sg_list[i].address & TW_CPU_TO_SGL(TW_ALIGNMENT_9000_SGL)) {
1888 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2f, "Found unaligned sgl address during internal post");
1889 goto out;
1892 command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN(0, use_sg));
1895 if (srb) {
1896 if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == WRITE_6)
1897 num_sectors = (u32)srb->cmnd[4];
1899 if (srb->cmnd[0] == READ_10 || srb->cmnd[0] == WRITE_10)
1900 num_sectors = (u32)srb->cmnd[8] | ((u32)srb->cmnd[7] << 8);
1903 /* Update sector statistic */
1904 tw_dev->sector_count = num_sectors;
1905 if (tw_dev->sector_count > tw_dev->max_sector_count)
1906 tw_dev->max_sector_count = tw_dev->sector_count;
1908 /* Update SG statistics */
1909 if (srb) {
1910 tw_dev->sgl_entries = scsi_sg_count(tw_dev->srb[request_id]);
1911 if (tw_dev->sgl_entries > tw_dev->max_sgl_entries)
1912 tw_dev->max_sgl_entries = tw_dev->sgl_entries;
1915 /* Now post the command to the board */
1916 if (srb) {
1917 retval = twa_post_command_packet(tw_dev, request_id, 0);
1918 } else {
1919 twa_post_command_packet(tw_dev, request_id, 1);
1920 retval = 0;
1922 out:
1923 return retval;
1924 } /* End twa_scsiop_execute_scsi() */
1926 /* This function completes an execute scsi operation */
1927 static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int request_id)
1929 struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1931 if (scsi_bufflen(cmd) < TW_MIN_SGL_LENGTH &&
1932 (cmd->sc_data_direction == DMA_FROM_DEVICE ||
1933 cmd->sc_data_direction == DMA_BIDIRECTIONAL)) {
1934 if (scsi_sg_count(cmd) == 1) {
1935 void *buf = tw_dev->generic_buffer_virt[request_id];
1937 scsi_sg_copy_from_buffer(cmd, buf, TW_SECTOR_SIZE);
1940 } /* End twa_scsiop_execute_scsi_complete() */
1942 /* This function tells the controller to shut down */
1943 static void __twa_shutdown(TW_Device_Extension *tw_dev)
1945 /* Disable interrupts */
1946 TW_DISABLE_INTERRUPTS(tw_dev);
1948 /* Free up the IRQ */
1949 free_irq(tw_dev->tw_pci_dev->irq, tw_dev);
1951 printk(KERN_WARNING "3w-9xxx: Shutting down host %d.\n", tw_dev->host->host_no);
1953 /* Tell the card we are shutting down */
1954 if (twa_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) {
1955 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x31, "Connection shutdown failed");
1956 } else {
1957 printk(KERN_WARNING "3w-9xxx: Shutdown complete.\n");
1960 /* Clear all interrupts just before exit */
1961 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
1962 } /* End __twa_shutdown() */
1964 /* Wrapper for __twa_shutdown */
1965 static void twa_shutdown(struct pci_dev *pdev)
1967 struct Scsi_Host *host = pci_get_drvdata(pdev);
1968 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
1970 __twa_shutdown(tw_dev);
1971 } /* End twa_shutdown() */
1973 /* This function will look up a string */
1974 static char *twa_string_lookup(twa_message_type *table, unsigned int code)
1976 int index;
1978 for (index = 0; ((code != table[index].code) &&
1979 (table[index].text != (char *)0)); index++);
1980 return(table[index].text);
1981 } /* End twa_string_lookup() */
1983 /* This function will perform a pci-dma unmap */
1984 static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
1986 struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1988 if (cmd->SCp.phase == TW_PHASE_SGLIST)
1989 scsi_dma_unmap(cmd);
1990 } /* End twa_unmap_scsi_data() */
1992 /* scsi_host_template initializer */
1993 static struct scsi_host_template driver_template = {
1994 .module = THIS_MODULE,
1995 .name = "3ware 9000 Storage Controller",
1996 .queuecommand = twa_scsi_queue,
1997 .eh_host_reset_handler = twa_scsi_eh_reset,
1998 .bios_param = twa_scsi_biosparam,
1999 .change_queue_depth = twa_change_queue_depth,
2000 .can_queue = TW_Q_LENGTH-2,
2001 .this_id = -1,
2002 .sg_tablesize = TW_APACHE_MAX_SGL_LENGTH,
2003 .max_sectors = TW_MAX_SECTORS,
2004 .cmd_per_lun = TW_MAX_CMDS_PER_LUN,
2005 .use_clustering = ENABLE_CLUSTERING,
2006 .shost_attrs = twa_host_attrs,
2007 .emulated = 1
2010 /* This function will probe and initialize a card */
2011 static int __devinit twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
2013 struct Scsi_Host *host = NULL;
2014 TW_Device_Extension *tw_dev;
2015 unsigned long mem_addr, mem_len;
2016 int retval = -ENODEV;
2018 retval = pci_enable_device(pdev);
2019 if (retval) {
2020 TW_PRINTK(host, TW_DRIVER, 0x34, "Failed to enable pci device");
2021 goto out_disable_device;
2024 pci_set_master(pdev);
2025 pci_try_set_mwi(pdev);
2027 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64))
2028 || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))
2029 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
2030 || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
2031 TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask");
2032 retval = -ENODEV;
2033 goto out_disable_device;
2036 host = scsi_host_alloc(&driver_template, sizeof(TW_Device_Extension));
2037 if (!host) {
2038 TW_PRINTK(host, TW_DRIVER, 0x24, "Failed to allocate memory for device extension");
2039 retval = -ENOMEM;
2040 goto out_disable_device;
2042 tw_dev = (TW_Device_Extension *)host->hostdata;
2044 /* Save values to device extension */
2045 tw_dev->host = host;
2046 tw_dev->tw_pci_dev = pdev;
2048 if (twa_initialize_device_extension(tw_dev)) {
2049 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x25, "Failed to initialize device extension");
2050 goto out_free_device_extension;
2053 /* Request IO regions */
2054 retval = pci_request_regions(pdev, "3w-9xxx");
2055 if (retval) {
2056 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x26, "Failed to get mem region");
2057 goto out_free_device_extension;
2060 if (pdev->device == PCI_DEVICE_ID_3WARE_9000) {
2061 mem_addr = pci_resource_start(pdev, 1);
2062 mem_len = pci_resource_len(pdev, 1);
2063 } else {
2064 mem_addr = pci_resource_start(pdev, 2);
2065 mem_len = pci_resource_len(pdev, 2);
2068 /* Save base address */
2069 tw_dev->base_addr = ioremap(mem_addr, mem_len);
2070 if (!tw_dev->base_addr) {
2071 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x35, "Failed to ioremap");
2072 goto out_release_mem_region;
2075 /* Disable interrupts on the card */
2076 TW_DISABLE_INTERRUPTS(tw_dev);
2078 /* Initialize the card */
2079 if (twa_reset_sequence(tw_dev, 0))
2080 goto out_iounmap;
2082 /* Set host specific parameters */
2083 if ((pdev->device == PCI_DEVICE_ID_3WARE_9650SE) ||
2084 (pdev->device == PCI_DEVICE_ID_3WARE_9690SA))
2085 host->max_id = TW_MAX_UNITS_9650SE;
2086 else
2087 host->max_id = TW_MAX_UNITS;
2089 host->max_cmd_len = TW_MAX_CDB_LEN;
2091 /* Channels aren't supported by adapter */
2092 host->max_lun = TW_MAX_LUNS(tw_dev->tw_compat_info.working_srl);
2093 host->max_channel = 0;
2095 /* Register the card with the kernel SCSI layer */
2096 retval = scsi_add_host(host, &pdev->dev);
2097 if (retval) {
2098 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x27, "scsi add host failed");
2099 goto out_iounmap;
2102 pci_set_drvdata(pdev, host);
2104 printk(KERN_WARNING "3w-9xxx: scsi%d: Found a 3ware 9000 Storage Controller at 0x%lx, IRQ: %d.\n",
2105 host->host_no, mem_addr, pdev->irq);
2106 printk(KERN_WARNING "3w-9xxx: scsi%d: Firmware %s, BIOS %s, Ports: %d.\n",
2107 host->host_no,
2108 (char *)twa_get_param(tw_dev, 0, TW_VERSION_TABLE,
2109 TW_PARAM_FWVER, TW_PARAM_FWVER_LENGTH),
2110 (char *)twa_get_param(tw_dev, 1, TW_VERSION_TABLE,
2111 TW_PARAM_BIOSVER, TW_PARAM_BIOSVER_LENGTH),
2112 le32_to_cpu(*(int *)twa_get_param(tw_dev, 2, TW_INFORMATION_TABLE,
2113 TW_PARAM_PORTCOUNT, TW_PARAM_PORTCOUNT_LENGTH)));
2115 /* Try to enable MSI */
2116 if (use_msi && (pdev->device != PCI_DEVICE_ID_3WARE_9000) &&
2117 !pci_enable_msi(pdev))
2118 set_bit(TW_USING_MSI, &tw_dev->flags);
2120 /* Now setup the interrupt handler */
2121 retval = request_irq(pdev->irq, twa_interrupt, IRQF_SHARED, "3w-9xxx", tw_dev);
2122 if (retval) {
2123 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x30, "Error requesting IRQ");
2124 goto out_remove_host;
2127 twa_device_extension_list[twa_device_extension_count] = tw_dev;
2128 twa_device_extension_count++;
2130 /* Re-enable interrupts on the card */
2131 TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
2133 /* Finally, scan the host */
2134 scsi_scan_host(host);
2136 if (twa_major == -1) {
2137 if ((twa_major = register_chrdev (0, "twa", &twa_fops)) < 0)
2138 TW_PRINTK(host, TW_DRIVER, 0x29, "Failed to register character device");
2140 return 0;
2142 out_remove_host:
2143 if (test_bit(TW_USING_MSI, &tw_dev->flags))
2144 pci_disable_msi(pdev);
2145 scsi_remove_host(host);
2146 out_iounmap:
2147 iounmap(tw_dev->base_addr);
2148 out_release_mem_region:
2149 pci_release_regions(pdev);
2150 out_free_device_extension:
2151 twa_free_device_extension(tw_dev);
2152 scsi_host_put(host);
2153 out_disable_device:
2154 pci_disable_device(pdev);
2156 return retval;
2157 } /* End twa_probe() */
2159 /* This function is called to remove a device */
2160 static void twa_remove(struct pci_dev *pdev)
2162 struct Scsi_Host *host = pci_get_drvdata(pdev);
2163 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
2165 scsi_remove_host(tw_dev->host);
2167 /* Unregister character device */
2168 if (twa_major >= 0) {
2169 unregister_chrdev(twa_major, "twa");
2170 twa_major = -1;
2173 /* Shutdown the card */
2174 __twa_shutdown(tw_dev);
2176 /* Disable MSI if enabled */
2177 if (test_bit(TW_USING_MSI, &tw_dev->flags))
2178 pci_disable_msi(pdev);
2180 /* Free IO remapping */
2181 iounmap(tw_dev->base_addr);
2183 /* Free up the mem region */
2184 pci_release_regions(pdev);
2186 /* Free up device extension resources */
2187 twa_free_device_extension(tw_dev);
2189 scsi_host_put(tw_dev->host);
2190 pci_disable_device(pdev);
2191 twa_device_extension_count--;
2192 } /* End twa_remove() */
2194 #ifdef CONFIG_PM
2195 /* This function is called on PCI suspend */
2196 static int twa_suspend(struct pci_dev *pdev, pm_message_t state)
2198 struct Scsi_Host *host = pci_get_drvdata(pdev);
2199 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
2201 printk(KERN_WARNING "3w-9xxx: Suspending host %d.\n", tw_dev->host->host_no);
2203 TW_DISABLE_INTERRUPTS(tw_dev);
2204 free_irq(tw_dev->tw_pci_dev->irq, tw_dev);
2206 if (test_bit(TW_USING_MSI, &tw_dev->flags))
2207 pci_disable_msi(pdev);
2209 /* Tell the card we are shutting down */
2210 if (twa_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) {
2211 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x38, "Connection shutdown failed during suspend");
2212 } else {
2213 printk(KERN_WARNING "3w-9xxx: Suspend complete.\n");
2215 TW_CLEAR_ALL_INTERRUPTS(tw_dev);
2217 pci_save_state(pdev);
2218 pci_disable_device(pdev);
2219 pci_set_power_state(pdev, pci_choose_state(pdev, state));
2221 return 0;
2222 } /* End twa_suspend() */
2224 /* This function is called on PCI resume */
2225 static int twa_resume(struct pci_dev *pdev)
2227 int retval = 0;
2228 struct Scsi_Host *host = pci_get_drvdata(pdev);
2229 TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
2231 printk(KERN_WARNING "3w-9xxx: Resuming host %d.\n", tw_dev->host->host_no);
2232 pci_set_power_state(pdev, PCI_D0);
2233 pci_enable_wake(pdev, PCI_D0, 0);
2234 pci_restore_state(pdev);
2236 retval = pci_enable_device(pdev);
2237 if (retval) {
2238 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x39, "Enable device failed during resume");
2239 return retval;
2242 pci_set_master(pdev);
2243 pci_try_set_mwi(pdev);
2245 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64))
2246 || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))
2247 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
2248 || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
2249 TW_PRINTK(host, TW_DRIVER, 0x40, "Failed to set dma mask during resume");
2250 retval = -ENODEV;
2251 goto out_disable_device;
2254 /* Initialize the card */
2255 if (twa_reset_sequence(tw_dev, 0)) {
2256 retval = -ENODEV;
2257 goto out_disable_device;
2260 /* Now setup the interrupt handler */
2261 retval = request_irq(pdev->irq, twa_interrupt, IRQF_SHARED, "3w-9xxx", tw_dev);
2262 if (retval) {
2263 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x42, "Error requesting IRQ during resume");
2264 retval = -ENODEV;
2265 goto out_disable_device;
2268 /* Now enable MSI if enabled */
2269 if (test_bit(TW_USING_MSI, &tw_dev->flags))
2270 pci_enable_msi(pdev);
2272 /* Re-enable interrupts on the card */
2273 TW_ENABLE_AND_CLEAR_INTERRUPTS(tw_dev);
2275 printk(KERN_WARNING "3w-9xxx: Resume complete.\n");
2276 return 0;
2278 out_disable_device:
2279 scsi_remove_host(host);
2280 pci_disable_device(pdev);
2282 return retval;
2283 } /* End twa_resume() */
2284 #endif
2286 /* PCI Devices supported by this driver */
2287 static struct pci_device_id twa_pci_tbl[] __devinitdata = {
2288 { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9000,
2289 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2290 { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9550SX,
2291 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2292 { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9650SE,
2293 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2294 { PCI_VENDOR_ID_3WARE, PCI_DEVICE_ID_3WARE_9690SA,
2295 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
2298 MODULE_DEVICE_TABLE(pci, twa_pci_tbl);
2300 /* pci_driver initializer */
2301 static struct pci_driver twa_driver = {
2302 .name = "3w-9xxx",
2303 .id_table = twa_pci_tbl,
2304 .probe = twa_probe,
2305 .remove = twa_remove,
2306 #ifdef CONFIG_PM
2307 .suspend = twa_suspend,
2308 .resume = twa_resume,
2309 #endif
2310 .shutdown = twa_shutdown
2313 /* This function is called on driver initialization */
2314 static int __init twa_init(void)
2316 printk(KERN_WARNING "3ware 9000 Storage Controller device driver for Linux v%s.\n", TW_DRIVER_VERSION);
2318 return pci_register_driver(&twa_driver);
2319 } /* End twa_init() */
2321 /* This function is called on driver exit */
2322 static void __exit twa_exit(void)
2324 pci_unregister_driver(&twa_driver);
2325 } /* End twa_exit() */
2327 module_init(twa_init);
2328 module_exit(twa_exit);