Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
[sfrench/cifs-2.6.git] / drivers / scsi / 3w-sas.c
1 /*
2    3w-sas.c -- LSI 3ware SAS/SATA-RAID Controller device driver for Linux.
3
4    Written By: Adam Radford <linuxraid@lsi.com>
5
6    Copyright (C) 2009 LSI Corporation.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; version 2 of the License.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    NO WARRANTY
18    THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
19    CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
20    LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
21    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
22    solely responsible for determining the appropriateness of using and
23    distributing the Program and assumes all risks associated with its
24    exercise of rights under this Agreement, including but not limited to
25    the risks and costs of program errors, damage to or loss of data,
26    programs or equipment, and unavailability or interruption of operations.
27
28    DISCLAIMER OF LIABILITY
29    NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
30    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31    DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
32    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
33    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
34    USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
35    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
36
37    You should have received a copy of the GNU General Public License
38    along with this program; if not, write to the Free Software
39    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
40
41    Controllers supported by this driver:
42
43    LSI 3ware 9750 6Gb/s SAS/SATA-RAID
44
45    Bugs/Comments/Suggestions should be mailed to:
46    linuxraid@lsi.com
47
48    For more information, goto:
49    http://www.lsi.com
50
51    History
52    -------
53    3.26.02.000 - Initial driver release.
54 */
55
56 #include <linux/module.h>
57 #include <linux/reboot.h>
58 #include <linux/spinlock.h>
59 #include <linux/interrupt.h>
60 #include <linux/moduleparam.h>
61 #include <linux/errno.h>
62 #include <linux/types.h>
63 #include <linux/delay.h>
64 #include <linux/pci.h>
65 #include <linux/time.h>
66 #include <linux/mutex.h>
67 #include <linux/smp_lock.h>
68 #include <asm/io.h>
69 #include <asm/irq.h>
70 #include <asm/uaccess.h>
71 #include <scsi/scsi.h>
72 #include <scsi/scsi_host.h>
73 #include <scsi/scsi_tcq.h>
74 #include <scsi/scsi_cmnd.h>
75 #include "3w-sas.h"
76
77 /* Globals */
78 #define TW_DRIVER_VERSION "3.26.02.000"
79 static TW_Device_Extension *twl_device_extension_list[TW_MAX_SLOT];
80 static unsigned int twl_device_extension_count;
81 static int twl_major = -1;
82 extern struct timezone sys_tz;
83
84 /* Module parameters */
85 MODULE_AUTHOR ("LSI");
86 MODULE_DESCRIPTION ("LSI 3ware SAS/SATA-RAID Linux Driver");
87 MODULE_LICENSE("GPL");
88 MODULE_VERSION(TW_DRIVER_VERSION);
89
90 static int use_msi;
91 module_param(use_msi, int, S_IRUGO);
92 MODULE_PARM_DESC(use_msi, "Use Message Signaled Interrupts. Default: 0");
93
94 /* Function prototypes */
95 static int twl_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_reset);
96
97 /* Functions */
98
99 /* This function returns AENs through sysfs */
100 static ssize_t twl_sysfs_aen_read(struct kobject *kobj,
101                                   struct bin_attribute *bin_attr,
102                                   char *outbuf, loff_t offset, size_t count)
103 {
104         struct device *dev = container_of(kobj, struct device, kobj);
105         struct Scsi_Host *shost = class_to_shost(dev);
106         TW_Device_Extension *tw_dev = (TW_Device_Extension *)shost->hostdata;
107         unsigned long flags = 0;
108         ssize_t ret;
109
110         if (!capable(CAP_SYS_ADMIN))
111                 return -EACCES;
112
113         spin_lock_irqsave(tw_dev->host->host_lock, flags);
114         ret = memory_read_from_buffer(outbuf, count, &offset, tw_dev->event_queue[0], sizeof(TW_Event) * TW_Q_LENGTH);
115         spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
116
117         return ret;
118 } /* End twl_sysfs_aen_read() */
119
120 /* aen_read sysfs attribute initializer */
121 static struct bin_attribute twl_sysfs_aen_read_attr = {
122         .attr = {
123                 .name = "3ware_aen_read",
124                 .mode = S_IRUSR,
125         }, 
126         .size = 0,
127         .read = twl_sysfs_aen_read
128 };
129
130 /* This function returns driver compatibility info through sysfs */
131 static ssize_t twl_sysfs_compat_info(struct kobject *kobj,
132                                      struct bin_attribute *bin_attr,
133                                      char *outbuf, loff_t offset, size_t count)
134 {
135         struct device *dev = container_of(kobj, struct device, kobj);
136         struct Scsi_Host *shost = class_to_shost(dev);
137         TW_Device_Extension *tw_dev = (TW_Device_Extension *)shost->hostdata;
138         unsigned long flags = 0;
139         ssize_t ret;
140
141         if (!capable(CAP_SYS_ADMIN))
142                 return -EACCES;
143
144         spin_lock_irqsave(tw_dev->host->host_lock, flags);
145         ret = memory_read_from_buffer(outbuf, count, &offset, &tw_dev->tw_compat_info, sizeof(TW_Compatibility_Info));
146         spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
147
148         return ret;
149 } /* End twl_sysfs_compat_info() */
150
151 /* compat_info sysfs attribute initializer */
152 static struct bin_attribute twl_sysfs_compat_info_attr = {
153         .attr = {
154                 .name = "3ware_compat_info",
155                 .mode = S_IRUSR,
156         }, 
157         .size = 0,
158         .read = twl_sysfs_compat_info
159 };
160
161 /* Show some statistics about the card */
162 static ssize_t twl_show_stats(struct device *dev,
163                               struct device_attribute *attr, char *buf)
164 {
165         struct Scsi_Host *host = class_to_shost(dev);
166         TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
167         unsigned long flags = 0;
168         ssize_t len;
169
170         spin_lock_irqsave(tw_dev->host->host_lock, flags);
171         len = snprintf(buf, PAGE_SIZE, "3w-sas Driver version: %s\n"
172                        "Current commands posted:   %4d\n"
173                        "Max commands posted:       %4d\n"
174                        "Last sgl length:           %4d\n"
175                        "Max sgl length:            %4d\n"
176                        "Last sector count:         %4d\n"
177                        "Max sector count:          %4d\n"
178                        "SCSI Host Resets:          %4d\n"
179                        "AEN's:                     %4d\n", 
180                        TW_DRIVER_VERSION,
181                        tw_dev->posted_request_count,
182                        tw_dev->max_posted_request_count,
183                        tw_dev->sgl_entries,
184                        tw_dev->max_sgl_entries,
185                        tw_dev->sector_count,
186                        tw_dev->max_sector_count,
187                        tw_dev->num_resets,
188                        tw_dev->aen_count);
189         spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
190         return len;
191 } /* End twl_show_stats() */
192
193 /* This function will set a devices queue depth */
194 static int twl_change_queue_depth(struct scsi_device *sdev, int queue_depth,
195                                   int reason)
196 {
197         if (reason != SCSI_QDEPTH_DEFAULT)
198                 return -EOPNOTSUPP;
199
200         if (queue_depth > TW_Q_LENGTH-2)
201                 queue_depth = TW_Q_LENGTH-2;
202         scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, queue_depth);
203         return queue_depth;
204 } /* End twl_change_queue_depth() */
205
206 /* stats sysfs attribute initializer */
207 static struct device_attribute twl_host_stats_attr = {
208         .attr = {
209                 .name =         "3ware_stats",
210                 .mode =         S_IRUGO,
211         },
212         .show = twl_show_stats
213 };
214
215 /* Host attributes initializer */
216 static struct device_attribute *twl_host_attrs[] = {
217         &twl_host_stats_attr,
218         NULL,
219 };
220
221 /* This function will look up an AEN severity string */
222 static char *twl_aen_severity_lookup(unsigned char severity_code)
223 {
224         char *retval = NULL;
225
226         if ((severity_code < (unsigned char) TW_AEN_SEVERITY_ERROR) ||
227             (severity_code > (unsigned char) TW_AEN_SEVERITY_DEBUG))
228                 goto out;
229
230         retval = twl_aen_severity_table[severity_code];
231 out:
232         return retval;
233 } /* End twl_aen_severity_lookup() */
234
235 /* This function will queue an event */
236 static void twl_aen_queue_event(TW_Device_Extension *tw_dev, TW_Command_Apache_Header *header)
237 {
238         u32 local_time;
239         struct timeval time;
240         TW_Event *event;
241         unsigned short aen;
242         char host[16];
243         char *error_str;
244
245         tw_dev->aen_count++;
246
247         /* Fill out event info */
248         event = tw_dev->event_queue[tw_dev->error_index];
249
250         host[0] = '\0';
251         if (tw_dev->host)
252                 sprintf(host, " scsi%d:", tw_dev->host->host_no);
253
254         aen = le16_to_cpu(header->status_block.error);
255         memset(event, 0, sizeof(TW_Event));
256
257         event->severity = TW_SEV_OUT(header->status_block.severity__reserved);
258         do_gettimeofday(&time);
259         local_time = (u32)(time.tv_sec - (sys_tz.tz_minuteswest * 60));
260         event->time_stamp_sec = local_time;
261         event->aen_code = aen;
262         event->retrieved = TW_AEN_NOT_RETRIEVED;
263         event->sequence_id = tw_dev->error_sequence_id;
264         tw_dev->error_sequence_id++;
265
266         /* Check for embedded error string */
267         error_str = &(header->err_specific_desc[strlen(header->err_specific_desc)+1]);
268
269         header->err_specific_desc[sizeof(header->err_specific_desc) - 1] = '\0';
270         event->parameter_len = strlen(header->err_specific_desc);
271         memcpy(event->parameter_data, header->err_specific_desc, event->parameter_len + 1 + strlen(error_str));
272         if (event->severity != TW_AEN_SEVERITY_DEBUG)
273                 printk(KERN_WARNING "3w-sas:%s AEN: %s (0x%02X:0x%04X): %s:%s.\n",
274                        host,
275                        twl_aen_severity_lookup(TW_SEV_OUT(header->status_block.severity__reserved)),
276                        TW_MESSAGE_SOURCE_CONTROLLER_EVENT, aen, error_str,
277                        header->err_specific_desc);
278         else
279                 tw_dev->aen_count--;
280
281         tw_dev->error_index = (tw_dev->error_index + 1 ) % TW_Q_LENGTH;
282 } /* End twl_aen_queue_event() */
283
284 /* This function will attempt to post a command packet to the board */
285 static int twl_post_command_packet(TW_Device_Extension *tw_dev, int request_id)
286 {
287         dma_addr_t command_que_value;
288
289         command_que_value = tw_dev->command_packet_phys[request_id];
290         command_que_value += TW_COMMAND_OFFSET;
291
292         /* First write upper 4 bytes */
293         writel((u32)((u64)command_que_value >> 32), TWL_HIBQPH_REG_ADDR(tw_dev));
294         /* Then the lower 4 bytes */
295         writel((u32)(command_que_value | TWL_PULL_MODE), TWL_HIBQPL_REG_ADDR(tw_dev));
296
297         tw_dev->state[request_id] = TW_S_POSTED;
298         tw_dev->posted_request_count++;
299         if (tw_dev->posted_request_count > tw_dev->max_posted_request_count)
300                 tw_dev->max_posted_request_count = tw_dev->posted_request_count;
301
302         return 0;
303 } /* End twl_post_command_packet() */
304
305 /* This function will perform a pci-dma mapping for a scatter gather list */
306 static int twl_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id)
307 {
308         int use_sg;
309         struct scsi_cmnd *cmd = tw_dev->srb[request_id];
310
311         use_sg = scsi_dma_map(cmd);
312         if (!use_sg)
313                 return 0;
314         else if (use_sg < 0) {
315                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Failed to map scatter gather list");
316                 return 0;
317         }
318
319         cmd->SCp.phase = TW_PHASE_SGLIST;
320         cmd->SCp.have_data_in = use_sg;
321
322         return use_sg;
323 } /* End twl_map_scsi_sg_data() */
324
325 /* This function hands scsi cdb's to the firmware */
326 static int twl_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, char *cdb, int use_sg, TW_SG_Entry_ISO *sglistarg)
327 {
328         TW_Command_Full *full_command_packet;
329         TW_Command_Apache *command_packet;
330         int i, sg_count;
331         struct scsi_cmnd *srb = NULL;
332         struct scatterlist *sglist = NULL, *sg;
333         int retval = 1;
334
335         if (tw_dev->srb[request_id]) {
336                 srb = tw_dev->srb[request_id];
337                 if (scsi_sglist(srb))
338                         sglist = scsi_sglist(srb);
339         }
340
341         /* Initialize command packet */
342         full_command_packet = tw_dev->command_packet_virt[request_id];
343         full_command_packet->header.header_desc.size_header = 128;
344         full_command_packet->header.status_block.error = 0;
345         full_command_packet->header.status_block.severity__reserved = 0;
346
347         command_packet = &full_command_packet->command.newcommand;
348         command_packet->status = 0;
349         command_packet->opcode__reserved = TW_OPRES_IN(0, TW_OP_EXECUTE_SCSI);
350
351         /* We forced 16 byte cdb use earlier */
352         if (!cdb)
353                 memcpy(command_packet->cdb, srb->cmnd, TW_MAX_CDB_LEN);
354         else
355                 memcpy(command_packet->cdb, cdb, TW_MAX_CDB_LEN);
356
357         if (srb) {
358                 command_packet->unit = srb->device->id;
359                 command_packet->request_id__lunl =
360                         cpu_to_le16(TW_REQ_LUN_IN(srb->device->lun, request_id));
361         } else {
362                 command_packet->request_id__lunl =
363                         cpu_to_le16(TW_REQ_LUN_IN(0, request_id));
364                 command_packet->unit = 0;
365         }
366
367         command_packet->sgl_offset = 16;
368
369         if (!sglistarg) {
370                 /* Map sglist from scsi layer to cmd packet */
371                 if (scsi_sg_count(srb)) {
372                         sg_count = twl_map_scsi_sg_data(tw_dev, request_id);
373                         if (sg_count == 0)
374                                 goto out;
375
376                         scsi_for_each_sg(srb, sg, sg_count, i) {
377                                 command_packet->sg_list[i].address = TW_CPU_TO_SGL(sg_dma_address(sg));
378                                 command_packet->sg_list[i].length = TW_CPU_TO_SGL(sg_dma_len(sg));
379                         }
380                         command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN((srb->device->lun >> 4), scsi_sg_count(tw_dev->srb[request_id])));
381                 }
382         } else {
383                 /* Internal cdb post */
384                 for (i = 0; i < use_sg; i++) {
385                         command_packet->sg_list[i].address = TW_CPU_TO_SGL(sglistarg[i].address);
386                         command_packet->sg_list[i].length = TW_CPU_TO_SGL(sglistarg[i].length);
387                 }
388                 command_packet->sgl_entries__lunh = cpu_to_le16(TW_REQ_LUN_IN(0, use_sg));
389         }
390
391         /* Update some stats */
392         if (srb) {
393                 tw_dev->sector_count = scsi_bufflen(srb) / 512;
394                 if (tw_dev->sector_count > tw_dev->max_sector_count)
395                         tw_dev->max_sector_count = tw_dev->sector_count;
396                 tw_dev->sgl_entries = scsi_sg_count(srb);
397                 if (tw_dev->sgl_entries > tw_dev->max_sgl_entries)
398                         tw_dev->max_sgl_entries = tw_dev->sgl_entries;
399         }
400
401         /* Now post the command to the board */
402         retval = twl_post_command_packet(tw_dev, request_id);
403
404 out:
405         return retval;
406 } /* End twl_scsiop_execute_scsi() */
407
408 /* This function will read the aen queue from the isr */
409 static int twl_aen_read_queue(TW_Device_Extension *tw_dev, int request_id)
410 {
411         char cdb[TW_MAX_CDB_LEN];
412         TW_SG_Entry_ISO sglist[1];
413         TW_Command_Full *full_command_packet;
414         int retval = 1;
415
416         full_command_packet = tw_dev->command_packet_virt[request_id];
417         memset(full_command_packet, 0, sizeof(TW_Command_Full));
418
419         /* Initialize cdb */
420         memset(&cdb, 0, TW_MAX_CDB_LEN);
421         cdb[0] = REQUEST_SENSE; /* opcode */
422         cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
423
424         /* Initialize sglist */
425         memset(&sglist, 0, sizeof(TW_SG_Entry_ISO));
426         sglist[0].length = TW_SECTOR_SIZE;
427         sglist[0].address = tw_dev->generic_buffer_phys[request_id];
428
429         /* Mark internal command */
430         tw_dev->srb[request_id] = NULL;
431
432         /* Now post the command packet */
433         if (twl_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
434                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x2, "Post failed while reading AEN queue");
435                 goto out;
436         }
437         retval = 0;
438 out:
439         return retval;
440 } /* End twl_aen_read_queue() */
441
442 /* This function will sync firmware time with the host time */
443 static void twl_aen_sync_time(TW_Device_Extension *tw_dev, int request_id)
444 {
445         u32 schedulertime;
446         struct timeval utc;
447         TW_Command_Full *full_command_packet;
448         TW_Command *command_packet;
449         TW_Param_Apache *param;
450         u32 local_time;
451
452         /* Fill out the command packet */
453         full_command_packet = tw_dev->command_packet_virt[request_id];
454         memset(full_command_packet, 0, sizeof(TW_Command_Full));
455         command_packet = &full_command_packet->command.oldcommand;
456         command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_SET_PARAM);
457         command_packet->request_id = request_id;
458         command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
459         command_packet->byte8_offset.param.sgl[0].length = TW_CPU_TO_SGL(TW_SECTOR_SIZE);
460         command_packet->size = TW_COMMAND_SIZE;
461         command_packet->byte6_offset.parameter_count = cpu_to_le16(1);
462
463         /* Setup the param */
464         param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
465         memset(param, 0, TW_SECTOR_SIZE);
466         param->table_id = cpu_to_le16(TW_TIMEKEEP_TABLE | 0x8000); /* Controller time keep table */
467         param->parameter_id = cpu_to_le16(0x3); /* SchedulerTime */
468         param->parameter_size_bytes = cpu_to_le16(4);
469
470         /* Convert system time in UTC to local time seconds since last 
471            Sunday 12:00AM */
472         do_gettimeofday(&utc);
473         local_time = (u32)(utc.tv_sec - (sys_tz.tz_minuteswest * 60));
474         schedulertime = local_time - (3 * 86400);
475         schedulertime = cpu_to_le32(schedulertime % 604800);
476
477         memcpy(param->data, &schedulertime, sizeof(u32));
478
479         /* Mark internal command */
480         tw_dev->srb[request_id] = NULL;
481
482         /* Now post the command */
483         twl_post_command_packet(tw_dev, request_id);
484 } /* End twl_aen_sync_time() */
485
486 /* This function will assign an available request id */
487 static void twl_get_request_id(TW_Device_Extension *tw_dev, int *request_id)
488 {
489         *request_id = tw_dev->free_queue[tw_dev->free_head];
490         tw_dev->free_head = (tw_dev->free_head + 1) % TW_Q_LENGTH;
491         tw_dev->state[*request_id] = TW_S_STARTED;
492 } /* End twl_get_request_id() */
493
494 /* This function will free a request id */
495 static void twl_free_request_id(TW_Device_Extension *tw_dev, int request_id)
496 {
497         tw_dev->free_queue[tw_dev->free_tail] = request_id;
498         tw_dev->state[request_id] = TW_S_FINISHED;
499         tw_dev->free_tail = (tw_dev->free_tail + 1) % TW_Q_LENGTH;
500 } /* End twl_free_request_id() */
501
502 /* This function will complete an aen request from the isr */
503 static int twl_aen_complete(TW_Device_Extension *tw_dev, int request_id)
504 {
505         TW_Command_Full *full_command_packet;
506         TW_Command *command_packet;
507         TW_Command_Apache_Header *header;
508         unsigned short aen;
509         int retval = 1;
510
511         header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
512         tw_dev->posted_request_count--;
513         aen = le16_to_cpu(header->status_block.error);
514         full_command_packet = tw_dev->command_packet_virt[request_id];
515         command_packet = &full_command_packet->command.oldcommand;
516
517         /* First check for internal completion of set param for time sync */
518         if (TW_OP_OUT(command_packet->opcode__sgloffset) == TW_OP_SET_PARAM) {
519                 /* Keep reading the queue in case there are more aen's */
520                 if (twl_aen_read_queue(tw_dev, request_id))
521                         goto out2;
522                 else {
523                         retval = 0;
524                         goto out;
525                 }
526         }
527
528         switch (aen) {
529         case TW_AEN_QUEUE_EMPTY:
530                 /* Quit reading the queue if this is the last one */
531                 break;
532         case TW_AEN_SYNC_TIME_WITH_HOST:
533                 twl_aen_sync_time(tw_dev, request_id);
534                 retval = 0;
535                 goto out;
536         default:
537                 twl_aen_queue_event(tw_dev, header);
538
539                 /* If there are more aen's, keep reading the queue */
540                 if (twl_aen_read_queue(tw_dev, request_id))
541                         goto out2;
542                 else {
543                         retval = 0;
544                         goto out;
545                 }
546         }
547         retval = 0;
548 out2:
549         tw_dev->state[request_id] = TW_S_COMPLETED;
550         twl_free_request_id(tw_dev, request_id);
551         clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
552 out:
553         return retval;
554 } /* End twl_aen_complete() */
555
556 /* This function will poll for a response */
557 static int twl_poll_response(TW_Device_Extension *tw_dev, int request_id, int seconds)
558 {
559         unsigned long before;
560         dma_addr_t mfa;
561         u32 regh, regl;
562         u32 response;
563         int retval = 1;
564         int found = 0;
565
566         before = jiffies;
567
568         while (!found) {
569                 if (sizeof(dma_addr_t) > 4) {
570                         regh = readl(TWL_HOBQPH_REG_ADDR(tw_dev));
571                         regl = readl(TWL_HOBQPL_REG_ADDR(tw_dev));
572                         mfa = ((u64)regh << 32) | regl;
573                 } else
574                         mfa = readl(TWL_HOBQPL_REG_ADDR(tw_dev));
575
576                 response = (u32)mfa;
577
578                 if (TW_RESID_OUT(response) == request_id)
579                         found = 1;
580
581                 if (time_after(jiffies, before + HZ * seconds))
582                         goto out;
583
584                 msleep(50);
585         }
586         retval = 0;
587 out: 
588         return retval;
589 } /* End twl_poll_response() */
590
591 /* This function will drain the aen queue */
592 static int twl_aen_drain_queue(TW_Device_Extension *tw_dev, int no_check_reset)
593 {
594         int request_id = 0;
595         char cdb[TW_MAX_CDB_LEN];
596         TW_SG_Entry_ISO sglist[1];
597         int finished = 0, count = 0;
598         TW_Command_Full *full_command_packet;
599         TW_Command_Apache_Header *header;
600         unsigned short aen;
601         int first_reset = 0, queue = 0, retval = 1;
602
603         if (no_check_reset)
604                 first_reset = 0;
605         else
606                 first_reset = 1;
607
608         full_command_packet = tw_dev->command_packet_virt[request_id];
609         memset(full_command_packet, 0, sizeof(TW_Command_Full));
610
611         /* Initialize cdb */
612         memset(&cdb, 0, TW_MAX_CDB_LEN);
613         cdb[0] = REQUEST_SENSE; /* opcode */
614         cdb[4] = TW_ALLOCATION_LENGTH; /* allocation length */
615
616         /* Initialize sglist */
617         memset(&sglist, 0, sizeof(TW_SG_Entry_ISO));
618         sglist[0].length = TW_SECTOR_SIZE;
619         sglist[0].address = tw_dev->generic_buffer_phys[request_id];
620
621         /* Mark internal command */
622         tw_dev->srb[request_id] = NULL;
623
624         do {
625                 /* Send command to the board */
626                 if (twl_scsiop_execute_scsi(tw_dev, request_id, cdb, 1, sglist)) {
627                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x3, "Error posting request sense");
628                         goto out;
629                 }
630
631                 /* Now poll for completion */
632                 if (twl_poll_response(tw_dev, request_id, 30)) {
633                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x4, "No valid response while draining AEN queue");
634                         tw_dev->posted_request_count--;
635                         goto out;
636                 }
637
638                 tw_dev->posted_request_count--;
639                 header = (TW_Command_Apache_Header *)tw_dev->generic_buffer_virt[request_id];
640                 aen = le16_to_cpu(header->status_block.error);
641                 queue = 0;
642                 count++;
643
644                 switch (aen) {
645                 case TW_AEN_QUEUE_EMPTY:
646                         if (first_reset != 1)
647                                 goto out;
648                         else
649                                 finished = 1;
650                         break;
651                 case TW_AEN_SOFT_RESET:
652                         if (first_reset == 0)
653                                 first_reset = 1;
654                         else
655                                 queue = 1;
656                         break;
657                 case TW_AEN_SYNC_TIME_WITH_HOST:
658                         break;
659                 default:
660                         queue = 1;
661                 }
662
663                 /* Now queue an event info */
664                 if (queue)
665                         twl_aen_queue_event(tw_dev, header);
666         } while ((finished == 0) && (count < TW_MAX_AEN_DRAIN));
667
668         if (count == TW_MAX_AEN_DRAIN)
669                 goto out;
670
671         retval = 0;
672 out:
673         tw_dev->state[request_id] = TW_S_INITIAL;
674         return retval;
675 } /* End twl_aen_drain_queue() */
676
677 /* This function will allocate memory and check if it is correctly aligned */
678 static int twl_allocate_memory(TW_Device_Extension *tw_dev, int size, int which)
679 {
680         int i;
681         dma_addr_t dma_handle;
682         unsigned long *cpu_addr;
683         int retval = 1;
684
685         cpu_addr = pci_alloc_consistent(tw_dev->tw_pci_dev, size*TW_Q_LENGTH, &dma_handle);
686         if (!cpu_addr) {
687                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x5, "Memory allocation failed");
688                 goto out;
689         }
690
691         memset(cpu_addr, 0, size*TW_Q_LENGTH);
692
693         for (i = 0; i < TW_Q_LENGTH; i++) {
694                 switch(which) {
695                 case 0:
696                         tw_dev->command_packet_phys[i] = dma_handle+(i*size);
697                         tw_dev->command_packet_virt[i] = (TW_Command_Full *)((unsigned char *)cpu_addr + (i*size));
698                         break;
699                 case 1:
700                         tw_dev->generic_buffer_phys[i] = dma_handle+(i*size);
701                         tw_dev->generic_buffer_virt[i] = (unsigned long *)((unsigned char *)cpu_addr + (i*size));
702                         break;
703                 case 2:
704                         tw_dev->sense_buffer_phys[i] = dma_handle+(i*size);
705                         tw_dev->sense_buffer_virt[i] = (TW_Command_Apache_Header *)((unsigned char *)cpu_addr + (i*size));
706                         break;
707                 }
708         }
709         retval = 0;
710 out:
711         return retval;
712 } /* End twl_allocate_memory() */
713
714 /* This function will load the request id and various sgls for ioctls */
715 static void twl_load_sgl(TW_Device_Extension *tw_dev, TW_Command_Full *full_command_packet, int request_id, dma_addr_t dma_handle, int length)
716 {
717         TW_Command *oldcommand;
718         TW_Command_Apache *newcommand;
719         TW_SG_Entry_ISO *sgl;
720         unsigned int pae = 0;
721
722         if ((sizeof(long) < 8) && (sizeof(dma_addr_t) > 4))
723                 pae = 1;
724
725         if (TW_OP_OUT(full_command_packet->command.newcommand.opcode__reserved) == TW_OP_EXECUTE_SCSI) {
726                 newcommand = &full_command_packet->command.newcommand;
727                 newcommand->request_id__lunl =
728                         cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->request_id__lunl), request_id));
729                 if (length) {
730                         newcommand->sg_list[0].address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
731                         newcommand->sg_list[0].length = TW_CPU_TO_SGL(length);
732                 }
733                 newcommand->sgl_entries__lunh =
734                         cpu_to_le16(TW_REQ_LUN_IN(TW_LUN_OUT(newcommand->sgl_entries__lunh), length ? 1 : 0));
735         } else {
736                 oldcommand = &full_command_packet->command.oldcommand;
737                 oldcommand->request_id = request_id;
738
739                 if (TW_SGL_OUT(oldcommand->opcode__sgloffset)) {
740                         /* Load the sg list */
741                         sgl = (TW_SG_Entry_ISO *)((u32 *)oldcommand+oldcommand->size - (sizeof(TW_SG_Entry_ISO)/4) + pae + (sizeof(dma_addr_t) > 4 ? 1 : 0));
742                         sgl->address = TW_CPU_TO_SGL(dma_handle + sizeof(TW_Ioctl_Buf_Apache) - 1);
743                         sgl->length = TW_CPU_TO_SGL(length);
744                         oldcommand->size += pae;
745                         oldcommand->size += sizeof(dma_addr_t) > 4 ? 1 : 0;
746                 }
747         }
748 } /* End twl_load_sgl() */
749
750 /* This function handles ioctl for the character device
751    This interface is used by smartmontools open source software */
752 static int twl_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
753 {
754         long timeout;
755         unsigned long *cpu_addr, data_buffer_length_adjusted = 0, flags = 0;
756         dma_addr_t dma_handle;
757         int request_id = 0;
758         TW_Ioctl_Driver_Command driver_command;
759         TW_Ioctl_Buf_Apache *tw_ioctl;
760         TW_Command_Full *full_command_packet;
761         TW_Device_Extension *tw_dev = twl_device_extension_list[iminor(inode)];
762         int retval = -EFAULT;
763         void __user *argp = (void __user *)arg;
764
765         /* Only let one of these through at a time */
766         if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) {
767                 retval = -EINTR;
768                 goto out;
769         }
770
771         /* First copy down the driver command */
772         if (copy_from_user(&driver_command, argp, sizeof(TW_Ioctl_Driver_Command)))
773                 goto out2;
774
775         /* Check data buffer size */
776         if (driver_command.buffer_length > TW_MAX_SECTORS * 2048) {
777                 retval = -EINVAL;
778                 goto out2;
779         }
780
781         /* Hardware can only do multiple of 512 byte transfers */
782         data_buffer_length_adjusted = (driver_command.buffer_length + 511) & ~511;
783
784         /* Now allocate ioctl buf memory */
785         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);
786         if (!cpu_addr) {
787                 retval = -ENOMEM;
788                 goto out2;
789         }
790
791         tw_ioctl = (TW_Ioctl_Buf_Apache *)cpu_addr;
792
793         /* Now copy down the entire ioctl */
794         if (copy_from_user(tw_ioctl, argp, driver_command.buffer_length + sizeof(TW_Ioctl_Buf_Apache) - 1))
795                 goto out3;
796
797         /* See which ioctl we are doing */
798         switch (cmd) {
799         case TW_IOCTL_FIRMWARE_PASS_THROUGH:
800                 spin_lock_irqsave(tw_dev->host->host_lock, flags);
801                 twl_get_request_id(tw_dev, &request_id);
802
803                 /* Flag internal command */
804                 tw_dev->srb[request_id] = NULL;
805
806                 /* Flag chrdev ioctl */
807                 tw_dev->chrdev_request_id = request_id;
808
809                 full_command_packet = (TW_Command_Full *)&tw_ioctl->firmware_command;
810
811                 /* Load request id and sglist for both command types */
812                 twl_load_sgl(tw_dev, full_command_packet, request_id, dma_handle, data_buffer_length_adjusted);
813
814                 memcpy(tw_dev->command_packet_virt[request_id], &(tw_ioctl->firmware_command), sizeof(TW_Command_Full));
815
816                 /* Now post the command packet to the controller */
817                 twl_post_command_packet(tw_dev, request_id);
818                 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
819
820                 timeout = TW_IOCTL_CHRDEV_TIMEOUT*HZ;
821
822                 /* Now wait for command to complete */
823                 timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout);
824
825                 /* We timed out, and didn't get an interrupt */
826                 if (tw_dev->chrdev_request_id != TW_IOCTL_CHRDEV_FREE) {
827                         /* Now we need to reset the board */
828                         printk(KERN_WARNING "3w-sas: scsi%d: WARNING: (0x%02X:0x%04X): Character ioctl (0x%x) timed out, resetting card.\n",
829                                tw_dev->host->host_no, TW_DRIVER, 0x6,
830                                cmd);
831                         retval = -EIO;
832                         twl_reset_device_extension(tw_dev, 1);
833                         goto out3;
834                 }
835
836                 /* Now copy in the command packet response */
837                 memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virt[request_id], sizeof(TW_Command_Full));
838                 
839                 /* Now complete the io */
840                 spin_lock_irqsave(tw_dev->host->host_lock, flags);
841                 tw_dev->posted_request_count--;
842                 tw_dev->state[request_id] = TW_S_COMPLETED;
843                 twl_free_request_id(tw_dev, request_id);
844                 spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
845                 break;
846         default:
847                 retval = -ENOTTY;
848                 goto out3;
849         }
850
851         /* Now copy the entire response to userspace */
852         if (copy_to_user(argp, tw_ioctl, sizeof(TW_Ioctl_Buf_Apache) + driver_command.buffer_length - 1) == 0)
853                 retval = 0;
854 out3:
855         /* Now free ioctl buf memory */
856         dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, cpu_addr, dma_handle);
857 out2:
858         mutex_unlock(&tw_dev->ioctl_lock);
859 out:
860         return retval;
861 } /* End twl_chrdev_ioctl() */
862
863 /* This function handles open for the character device */
864 static int twl_chrdev_open(struct inode *inode, struct file *file)
865 {
866         unsigned int minor_number;
867         int retval = -ENODEV;
868
869         if (!capable(CAP_SYS_ADMIN)) {
870                 retval = -EACCES;
871                 goto out;
872         }
873
874         cycle_kernel_lock();
875         minor_number = iminor(inode);
876         if (minor_number >= twl_device_extension_count)
877                 goto out;
878         retval = 0;
879 out:
880         return retval;
881 } /* End twl_chrdev_open() */
882
883 /* File operations struct for character device */
884 static const struct file_operations twl_fops = {
885         .owner          = THIS_MODULE,
886         .ioctl          = twl_chrdev_ioctl,
887         .open           = twl_chrdev_open,
888         .release        = NULL
889 };
890
891 /* This function passes sense data from firmware to scsi layer */
892 static int twl_fill_sense(TW_Device_Extension *tw_dev, int i, int request_id, int copy_sense, int print_host)
893 {
894         TW_Command_Apache_Header *header;
895         TW_Command_Full *full_command_packet;
896         unsigned short error;
897         char *error_str;
898         int retval = 1;
899
900         header = tw_dev->sense_buffer_virt[i];
901         full_command_packet = tw_dev->command_packet_virt[request_id];
902
903         /* Get embedded firmware error string */
904         error_str = &(header->err_specific_desc[strlen(header->err_specific_desc) + 1]);
905
906         /* Don't print error for Logical unit not supported during rollcall */
907         error = le16_to_cpu(header->status_block.error);
908         if ((error != TW_ERROR_LOGICAL_UNIT_NOT_SUPPORTED) && (error != TW_ERROR_UNIT_OFFLINE) && (error != TW_ERROR_INVALID_FIELD_IN_CDB)) {
909                 if (print_host)
910                         printk(KERN_WARNING "3w-sas: scsi%d: ERROR: (0x%02X:0x%04X): %s:%s.\n",
911                                tw_dev->host->host_no,
912                                TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
913                                header->status_block.error,
914                                error_str, 
915                                header->err_specific_desc);
916                 else
917                         printk(KERN_WARNING "3w-sas: ERROR: (0x%02X:0x%04X): %s:%s.\n",
918                                TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
919                                header->status_block.error,
920                                error_str,
921                                header->err_specific_desc);
922         }
923
924         if (copy_sense) {
925                 memcpy(tw_dev->srb[request_id]->sense_buffer, header->sense_data, TW_SENSE_DATA_LENGTH);
926                 tw_dev->srb[request_id]->result = (full_command_packet->command.newcommand.status << 1);
927                 goto out;
928         }
929 out:
930         return retval;
931 } /* End twl_fill_sense() */
932
933 /* This function will free up device extension resources */
934 static void twl_free_device_extension(TW_Device_Extension *tw_dev)
935 {
936         if (tw_dev->command_packet_virt[0])
937                 pci_free_consistent(tw_dev->tw_pci_dev,
938                                     sizeof(TW_Command_Full)*TW_Q_LENGTH,
939                                     tw_dev->command_packet_virt[0],
940                                     tw_dev->command_packet_phys[0]);
941
942         if (tw_dev->generic_buffer_virt[0])
943                 pci_free_consistent(tw_dev->tw_pci_dev,
944                                     TW_SECTOR_SIZE*TW_Q_LENGTH,
945                                     tw_dev->generic_buffer_virt[0],
946                                     tw_dev->generic_buffer_phys[0]);
947
948         if (tw_dev->sense_buffer_virt[0])
949                 pci_free_consistent(tw_dev->tw_pci_dev,
950                                     sizeof(TW_Command_Apache_Header)*
951                                     TW_Q_LENGTH,
952                                     tw_dev->sense_buffer_virt[0],
953                                     tw_dev->sense_buffer_phys[0]);
954
955         kfree(tw_dev->event_queue[0]);
956 } /* End twl_free_device_extension() */
957
958 /* This function will get parameter table entries from the firmware */
959 static void *twl_get_param(TW_Device_Extension *tw_dev, int request_id, int table_id, int parameter_id, int parameter_size_bytes)
960 {
961         TW_Command_Full *full_command_packet;
962         TW_Command *command_packet;
963         TW_Param_Apache *param;
964         void *retval = NULL;
965
966         /* Setup the command packet */
967         full_command_packet = tw_dev->command_packet_virt[request_id];
968         memset(full_command_packet, 0, sizeof(TW_Command_Full));
969         command_packet = &full_command_packet->command.oldcommand;
970
971         command_packet->opcode__sgloffset = TW_OPSGL_IN(2, TW_OP_GET_PARAM);
972         command_packet->size              = TW_COMMAND_SIZE;
973         command_packet->request_id        = request_id;
974         command_packet->byte6_offset.block_count = cpu_to_le16(1);
975
976         /* Now setup the param */
977         param = (TW_Param_Apache *)tw_dev->generic_buffer_virt[request_id];
978         memset(param, 0, TW_SECTOR_SIZE);
979         param->table_id = cpu_to_le16(table_id | 0x8000);
980         param->parameter_id = cpu_to_le16(parameter_id);
981         param->parameter_size_bytes = cpu_to_le16(parameter_size_bytes);
982
983         command_packet->byte8_offset.param.sgl[0].address = TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
984         command_packet->byte8_offset.param.sgl[0].length = TW_CPU_TO_SGL(TW_SECTOR_SIZE);
985
986         /* Post the command packet to the board */
987         twl_post_command_packet(tw_dev, request_id);
988
989         /* Poll for completion */
990         if (twl_poll_response(tw_dev, request_id, 30))
991                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x7, "No valid response during get param")
992         else
993                 retval = (void *)&(param->data[0]);
994
995         tw_dev->posted_request_count--;
996         tw_dev->state[request_id] = TW_S_INITIAL;
997
998         return retval;
999 } /* End twl_get_param() */
1000
1001 /* This function will send an initconnection command to controller */
1002 static int twl_initconnection(TW_Device_Extension *tw_dev, int message_credits,
1003                               u32 set_features, unsigned short current_fw_srl, 
1004                               unsigned short current_fw_arch_id, 
1005                               unsigned short current_fw_branch, 
1006                               unsigned short current_fw_build, 
1007                               unsigned short *fw_on_ctlr_srl, 
1008                               unsigned short *fw_on_ctlr_arch_id, 
1009                               unsigned short *fw_on_ctlr_branch, 
1010                               unsigned short *fw_on_ctlr_build, 
1011                               u32 *init_connect_result)
1012 {
1013         TW_Command_Full *full_command_packet;
1014         TW_Initconnect *tw_initconnect;
1015         int request_id = 0, retval = 1;
1016
1017         /* Initialize InitConnection command packet */
1018         full_command_packet = tw_dev->command_packet_virt[request_id];
1019         memset(full_command_packet, 0, sizeof(TW_Command_Full));
1020         full_command_packet->header.header_desc.size_header = 128;
1021         
1022         tw_initconnect = (TW_Initconnect *)&full_command_packet->command.oldcommand;
1023         tw_initconnect->opcode__reserved = TW_OPRES_IN(0, TW_OP_INIT_CONNECTION);
1024         tw_initconnect->request_id = request_id;
1025         tw_initconnect->message_credits = cpu_to_le16(message_credits);
1026         tw_initconnect->features = set_features;
1027
1028         /* Turn on 64-bit sgl support if we need to */
1029         tw_initconnect->features |= sizeof(dma_addr_t) > 4 ? 1 : 0;
1030
1031         tw_initconnect->features = cpu_to_le32(tw_initconnect->features);
1032
1033         if (set_features & TW_EXTENDED_INIT_CONNECT) {
1034                 tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE_EXTENDED;
1035                 tw_initconnect->fw_srl = cpu_to_le16(current_fw_srl);
1036                 tw_initconnect->fw_arch_id = cpu_to_le16(current_fw_arch_id);
1037                 tw_initconnect->fw_branch = cpu_to_le16(current_fw_branch);
1038                 tw_initconnect->fw_build = cpu_to_le16(current_fw_build);
1039         } else 
1040                 tw_initconnect->size = TW_INIT_COMMAND_PACKET_SIZE;
1041
1042         /* Send command packet to the board */
1043         twl_post_command_packet(tw_dev, request_id);
1044
1045         /* Poll for completion */
1046         if (twl_poll_response(tw_dev, request_id, 30)) {
1047                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x8, "No valid response during init connection");
1048         } else {
1049                 if (set_features & TW_EXTENDED_INIT_CONNECT) {
1050                         *fw_on_ctlr_srl = le16_to_cpu(tw_initconnect->fw_srl);
1051                         *fw_on_ctlr_arch_id = le16_to_cpu(tw_initconnect->fw_arch_id);
1052                         *fw_on_ctlr_branch = le16_to_cpu(tw_initconnect->fw_branch);
1053                         *fw_on_ctlr_build = le16_to_cpu(tw_initconnect->fw_build);
1054                         *init_connect_result = le32_to_cpu(tw_initconnect->result);
1055                 }
1056                 retval = 0;
1057         }
1058
1059         tw_dev->posted_request_count--;
1060         tw_dev->state[request_id] = TW_S_INITIAL;
1061
1062         return retval;
1063 } /* End twl_initconnection() */
1064
1065 /* This function will initialize the fields of a device extension */
1066 static int twl_initialize_device_extension(TW_Device_Extension *tw_dev)
1067 {
1068         int i, retval = 1;
1069
1070         /* Initialize command packet buffers */
1071         if (twl_allocate_memory(tw_dev, sizeof(TW_Command_Full), 0)) {
1072                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x9, "Command packet memory allocation failed");
1073                 goto out;
1074         }
1075
1076         /* Initialize generic buffer */
1077         if (twl_allocate_memory(tw_dev, TW_SECTOR_SIZE, 1)) {
1078                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xa, "Generic memory allocation failed");
1079                 goto out;
1080         }
1081
1082         /* Allocate sense buffers */
1083         if (twl_allocate_memory(tw_dev, sizeof(TW_Command_Apache_Header), 2)) {
1084                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xb, "Sense buffer allocation failed");
1085                 goto out;
1086         }
1087
1088         /* Allocate event info space */
1089         tw_dev->event_queue[0] = kcalloc(TW_Q_LENGTH, sizeof(TW_Event), GFP_KERNEL);
1090         if (!tw_dev->event_queue[0]) {
1091                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xc, "Event info memory allocation failed");
1092                 goto out;
1093         }
1094
1095         for (i = 0; i < TW_Q_LENGTH; i++) {
1096                 tw_dev->event_queue[i] = (TW_Event *)((unsigned char *)tw_dev->event_queue[0] + (i * sizeof(TW_Event)));
1097                 tw_dev->free_queue[i] = i;
1098                 tw_dev->state[i] = TW_S_INITIAL;
1099         }
1100
1101         tw_dev->free_head = TW_Q_START;
1102         tw_dev->free_tail = TW_Q_START;
1103         tw_dev->error_sequence_id = 1;
1104         tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1105
1106         mutex_init(&tw_dev->ioctl_lock);
1107         init_waitqueue_head(&tw_dev->ioctl_wqueue);
1108
1109         retval = 0;
1110 out:
1111         return retval;
1112 } /* End twl_initialize_device_extension() */
1113
1114 /* This function will perform a pci-dma unmap */
1115 static void twl_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
1116 {
1117         struct scsi_cmnd *cmd = tw_dev->srb[request_id];
1118
1119         if (cmd->SCp.phase == TW_PHASE_SGLIST)
1120                 scsi_dma_unmap(cmd);
1121 } /* End twl_unmap_scsi_data() */
1122
1123 /* This function will handle attention interrupts */
1124 static int twl_handle_attention_interrupt(TW_Device_Extension *tw_dev)
1125 {
1126         int retval = 1;
1127         u32 request_id, doorbell;
1128
1129         /* Read doorbell status */
1130         doorbell = readl(TWL_HOBDB_REG_ADDR(tw_dev));
1131
1132         /* Check for controller errors */
1133         if (doorbell & TWL_DOORBELL_CONTROLLER_ERROR) {
1134                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xd, "Microcontroller Error: clearing");
1135                 goto out;
1136         }
1137
1138         /* Check if we need to perform an AEN drain */
1139         if (doorbell & TWL_DOORBELL_ATTENTION_INTERRUPT) {
1140                 if (!(test_and_set_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags))) {
1141                         twl_get_request_id(tw_dev, &request_id);
1142                         if (twl_aen_read_queue(tw_dev, request_id)) {
1143                                 tw_dev->state[request_id] = TW_S_COMPLETED;
1144                                 twl_free_request_id(tw_dev, request_id);
1145                                 clear_bit(TW_IN_ATTENTION_LOOP, &tw_dev->flags);
1146                         }
1147                 }
1148         }
1149
1150         retval = 0;
1151 out:
1152         /* Clear doorbell interrupt */
1153         TWL_CLEAR_DB_INTERRUPT(tw_dev);
1154
1155         /* Make sure the clear was flushed by reading it back */
1156         readl(TWL_HOBDBC_REG_ADDR(tw_dev));
1157
1158         return retval;
1159 } /* End twl_handle_attention_interrupt() */
1160
1161 /* Interrupt service routine */
1162 static irqreturn_t twl_interrupt(int irq, void *dev_instance)
1163 {
1164         TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance;
1165         int i, handled = 0, error = 0;
1166         dma_addr_t mfa = 0;
1167         u32 reg, regl, regh, response, request_id = 0;
1168         struct scsi_cmnd *cmd;
1169         TW_Command_Full *full_command_packet;
1170
1171         spin_lock(tw_dev->host->host_lock);
1172
1173         /* Read host interrupt status */
1174         reg = readl(TWL_HISTAT_REG_ADDR(tw_dev));
1175
1176         /* Check if this is our interrupt, otherwise bail */
1177         if (!(reg & TWL_HISTATUS_VALID_INTERRUPT))
1178                 goto twl_interrupt_bail;
1179
1180         handled = 1;
1181
1182         /* If we are resetting, bail */
1183         if (test_bit(TW_IN_RESET, &tw_dev->flags))
1184                 goto twl_interrupt_bail;
1185
1186         /* Attention interrupt */
1187         if (reg & TWL_HISTATUS_ATTENTION_INTERRUPT) {
1188                 if (twl_handle_attention_interrupt(tw_dev)) {
1189                         TWL_MASK_INTERRUPTS(tw_dev);
1190                         goto twl_interrupt_bail;
1191                 }
1192         }
1193
1194         /* Response interrupt */
1195         while (reg & TWL_HISTATUS_RESPONSE_INTERRUPT) {
1196                 if (sizeof(dma_addr_t) > 4) {
1197                         regh = readl(TWL_HOBQPH_REG_ADDR(tw_dev));
1198                         regl = readl(TWL_HOBQPL_REG_ADDR(tw_dev));
1199                         mfa = ((u64)regh << 32) | regl;
1200                 } else
1201                         mfa = readl(TWL_HOBQPL_REG_ADDR(tw_dev));
1202
1203                 error = 0;
1204                 response = (u32)mfa;
1205
1206                 /* Check for command packet error */
1207                 if (!TW_NOTMFA_OUT(response)) {
1208                         for (i=0;i<TW_Q_LENGTH;i++) {
1209                                 if (tw_dev->sense_buffer_phys[i] == mfa) {
1210                                         request_id = le16_to_cpu(tw_dev->sense_buffer_virt[i]->header_desc.request_id);
1211                                         if (tw_dev->srb[request_id] != NULL)
1212                                                 error = twl_fill_sense(tw_dev, i, request_id, 1, 1);
1213                                         else {
1214                                                 /* Skip ioctl error prints */
1215                                                 if (request_id != tw_dev->chrdev_request_id)
1216                                                         error = twl_fill_sense(tw_dev, i, request_id, 0, 1);
1217                                                 else
1218                                                         memcpy(tw_dev->command_packet_virt[request_id], tw_dev->sense_buffer_virt[i], sizeof(TW_Command_Apache_Header));
1219                                         }
1220
1221                                         /* Now re-post the sense buffer */
1222                                         writel((u32)((u64)tw_dev->sense_buffer_phys[i] >> 32), TWL_HOBQPH_REG_ADDR(tw_dev));
1223                                         writel((u32)tw_dev->sense_buffer_phys[i], TWL_HOBQPL_REG_ADDR(tw_dev));
1224                                         break;
1225                                 }
1226                         }
1227                 } else
1228                         request_id = TW_RESID_OUT(response);
1229
1230                 full_command_packet = tw_dev->command_packet_virt[request_id];
1231
1232                 /* Check for correct state */
1233                 if (tw_dev->state[request_id] != TW_S_POSTED) {
1234                         if (tw_dev->srb[request_id] != NULL) {
1235                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0xe, "Received a request id that wasn't posted");
1236                                 TWL_MASK_INTERRUPTS(tw_dev);
1237                                 goto twl_interrupt_bail;
1238                         }
1239                 }
1240
1241                 /* Check for internal command completion */
1242                 if (tw_dev->srb[request_id] == NULL) {
1243                         if (request_id != tw_dev->chrdev_request_id) {
1244                                 if (twl_aen_complete(tw_dev, request_id))
1245                                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0xf, "Error completing AEN during attention interrupt");
1246                         } else {
1247                                 tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1248                                 wake_up(&tw_dev->ioctl_wqueue);
1249                         }
1250                 } else {
1251                         cmd = tw_dev->srb[request_id];
1252
1253                         if (!error)
1254                                 cmd->result = (DID_OK << 16);
1255                         
1256                         /* Report residual bytes for single sgl */
1257                         if ((scsi_sg_count(cmd) <= 1) && (full_command_packet->command.newcommand.status == 0)) {
1258                                 if (full_command_packet->command.newcommand.sg_list[0].length < scsi_bufflen(tw_dev->srb[request_id]))
1259                                         scsi_set_resid(cmd, scsi_bufflen(cmd) - full_command_packet->command.newcommand.sg_list[0].length);
1260                         }
1261
1262                         /* Now complete the io */
1263                         tw_dev->state[request_id] = TW_S_COMPLETED;
1264                         twl_free_request_id(tw_dev, request_id);
1265                         tw_dev->posted_request_count--;
1266                         tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
1267                         twl_unmap_scsi_data(tw_dev, request_id);
1268                 }
1269
1270                 /* Check for another response interrupt */
1271                 reg = readl(TWL_HISTAT_REG_ADDR(tw_dev));
1272         }
1273
1274 twl_interrupt_bail:
1275         spin_unlock(tw_dev->host->host_lock);
1276         return IRQ_RETVAL(handled);
1277 } /* End twl_interrupt() */
1278
1279 /* This function will poll for a register change */
1280 static int twl_poll_register(TW_Device_Extension *tw_dev, void *reg, u32 value, u32 result, int seconds)
1281 {
1282         unsigned long before;
1283         int retval = 1;
1284         u32 reg_value;
1285
1286         reg_value = readl(reg);
1287         before = jiffies;
1288
1289         while ((reg_value & value) != result) {
1290                 reg_value = readl(reg);
1291                 if (time_after(jiffies, before + HZ * seconds))
1292                         goto out;
1293                 msleep(50);
1294         }
1295         retval = 0;
1296 out:
1297         return retval;
1298 } /* End twl_poll_register() */
1299
1300 /* This function will reset a controller */
1301 static int twl_reset_sequence(TW_Device_Extension *tw_dev, int soft_reset)
1302 {
1303         int retval = 1;
1304         int i = 0;
1305         u32 status = 0;
1306         unsigned short fw_on_ctlr_srl = 0, fw_on_ctlr_arch_id = 0;
1307         unsigned short fw_on_ctlr_branch = 0, fw_on_ctlr_build = 0;
1308         u32 init_connect_result = 0;
1309         int tries = 0;
1310         int do_soft_reset = soft_reset;
1311
1312         while (tries < TW_MAX_RESET_TRIES) {
1313                 /* Do a soft reset if one is needed */
1314                 if (do_soft_reset) {
1315                         TWL_SOFT_RESET(tw_dev);
1316
1317                         /* Make sure controller is in a good state */
1318                         if (twl_poll_register(tw_dev, TWL_SCRPD3_REG_ADDR(tw_dev), TWL_CONTROLLER_READY, 0x0, 30)) {
1319                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x10, "Controller never went non-ready during reset sequence");
1320                                 tries++;
1321                                 continue;
1322                         }
1323                         if (twl_poll_register(tw_dev, TWL_SCRPD3_REG_ADDR(tw_dev), TWL_CONTROLLER_READY, TWL_CONTROLLER_READY, 60)) {
1324                                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x11, "Controller not ready during reset sequence");
1325                                 tries++;
1326                                 continue;
1327                         }
1328                 }
1329
1330                 /* Initconnect */
1331                 if (twl_initconnection(tw_dev, TW_INIT_MESSAGE_CREDITS,
1332                                        TW_EXTENDED_INIT_CONNECT, TW_CURRENT_DRIVER_SRL,
1333                                        TW_9750_ARCH_ID, TW_CURRENT_DRIVER_BRANCH,
1334                                        TW_CURRENT_DRIVER_BUILD, &fw_on_ctlr_srl,
1335                                        &fw_on_ctlr_arch_id, &fw_on_ctlr_branch,
1336                                        &fw_on_ctlr_build, &init_connect_result)) {
1337                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x12, "Initconnection failed while checking SRL");
1338                         do_soft_reset = 1;
1339                         tries++;
1340                         continue;
1341                 }
1342
1343                 /* Load sense buffers */
1344                 while (i < TW_Q_LENGTH) {
1345                         writel((u32)((u64)tw_dev->sense_buffer_phys[i] >> 32), TWL_HOBQPH_REG_ADDR(tw_dev));
1346                         writel((u32)tw_dev->sense_buffer_phys[i], TWL_HOBQPL_REG_ADDR(tw_dev));
1347
1348                         /* Check status for over-run after each write */
1349                         status = readl(TWL_STATUS_REG_ADDR(tw_dev));
1350                         if (!(status & TWL_STATUS_OVERRUN_SUBMIT))
1351                             i++;
1352                 }
1353
1354                 /* Now check status */
1355                 status = readl(TWL_STATUS_REG_ADDR(tw_dev));
1356                 if (status) {
1357                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x13, "Bad controller status after loading sense buffers");
1358                         do_soft_reset = 1;
1359                         tries++;
1360                         continue;
1361                 }
1362
1363                 /* Drain the AEN queue */
1364                 if (twl_aen_drain_queue(tw_dev, soft_reset)) {
1365                         TW_PRINTK(tw_dev->host, TW_DRIVER, 0x14, "AEN drain failed during reset sequence");
1366                         do_soft_reset = 1;
1367                         tries++;
1368                         continue;
1369                 }
1370
1371                 /* Load rest of compatibility struct */
1372                 strncpy(tw_dev->tw_compat_info.driver_version, TW_DRIVER_VERSION, strlen(TW_DRIVER_VERSION));
1373                 tw_dev->tw_compat_info.driver_srl_high = TW_CURRENT_DRIVER_SRL;
1374                 tw_dev->tw_compat_info.driver_branch_high = TW_CURRENT_DRIVER_BRANCH;
1375                 tw_dev->tw_compat_info.driver_build_high = TW_CURRENT_DRIVER_BUILD;
1376                 tw_dev->tw_compat_info.driver_srl_low = TW_BASE_FW_SRL;
1377                 tw_dev->tw_compat_info.driver_branch_low = TW_BASE_FW_BRANCH;
1378                 tw_dev->tw_compat_info.driver_build_low = TW_BASE_FW_BUILD;
1379                 tw_dev->tw_compat_info.fw_on_ctlr_srl = fw_on_ctlr_srl;
1380                 tw_dev->tw_compat_info.fw_on_ctlr_branch = fw_on_ctlr_branch;
1381                 tw_dev->tw_compat_info.fw_on_ctlr_build = fw_on_ctlr_build;
1382
1383                 /* If we got here, controller is in a good state */
1384                 retval = 0;
1385                 goto out;
1386         }
1387 out:
1388         return retval;
1389 } /* End twl_reset_sequence() */
1390
1391 /* This function will reset a device extension */
1392 static int twl_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_reset)
1393 {
1394         int i = 0, retval = 1;
1395         unsigned long flags = 0;
1396
1397         /* Block SCSI requests while we are resetting */
1398         if (ioctl_reset)
1399                 scsi_block_requests(tw_dev->host);
1400
1401         set_bit(TW_IN_RESET, &tw_dev->flags);
1402         TWL_MASK_INTERRUPTS(tw_dev);
1403         TWL_CLEAR_DB_INTERRUPT(tw_dev);
1404
1405         spin_lock_irqsave(tw_dev->host->host_lock, flags);
1406
1407         /* Abort all requests that are in progress */
1408         for (i = 0; i < TW_Q_LENGTH; i++) {
1409                 if ((tw_dev->state[i] != TW_S_FINISHED) &&
1410                     (tw_dev->state[i] != TW_S_INITIAL) &&
1411                     (tw_dev->state[i] != TW_S_COMPLETED)) {
1412                         if (tw_dev->srb[i]) {
1413                                 tw_dev->srb[i]->result = (DID_RESET << 16);
1414                                 tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
1415                                 twl_unmap_scsi_data(tw_dev, i);
1416                         }
1417                 }
1418         }
1419
1420         /* Reset queues and counts */
1421         for (i = 0; i < TW_Q_LENGTH; i++) {
1422                 tw_dev->free_queue[i] = i;
1423                 tw_dev->state[i] = TW_S_INITIAL;
1424         }
1425         tw_dev->free_head = TW_Q_START;
1426         tw_dev->free_tail = TW_Q_START;
1427         tw_dev->posted_request_count = 0;
1428
1429         spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
1430
1431         if (twl_reset_sequence(tw_dev, 1))
1432                 goto out;
1433
1434         TWL_UNMASK_INTERRUPTS(tw_dev);
1435
1436         clear_bit(TW_IN_RESET, &tw_dev->flags);
1437         tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE;
1438
1439         retval = 0;
1440 out:
1441         if (ioctl_reset)
1442                 scsi_unblock_requests(tw_dev->host);
1443         return retval;
1444 } /* End twl_reset_device_extension() */
1445
1446 /* This funciton returns unit geometry in cylinders/heads/sectors */
1447 static int twl_scsi_biosparam(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int geom[])
1448 {
1449         int heads, sectors;
1450         TW_Device_Extension *tw_dev;
1451
1452         tw_dev = (TW_Device_Extension *)sdev->host->hostdata;
1453
1454         if (capacity >= 0x200000) {
1455                 heads = 255;
1456                 sectors = 63;
1457         } else {
1458                 heads = 64;
1459                 sectors = 32;
1460         }
1461
1462         geom[0] = heads;
1463         geom[1] = sectors;
1464         geom[2] = sector_div(capacity, heads * sectors); /* cylinders */
1465
1466         return 0;
1467 } /* End twl_scsi_biosparam() */
1468
1469 /* This is the new scsi eh reset function */
1470 static int twl_scsi_eh_reset(struct scsi_cmnd *SCpnt)
1471 {
1472         TW_Device_Extension *tw_dev = NULL;
1473         int retval = FAILED;
1474
1475         tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1476
1477         tw_dev->num_resets++;
1478
1479         sdev_printk(KERN_WARNING, SCpnt->device,
1480                 "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n",
1481                 TW_DRIVER, 0x2c, SCpnt->cmnd[0]);
1482
1483         /* Make sure we are not issuing an ioctl or resetting from ioctl */
1484         mutex_lock(&tw_dev->ioctl_lock);
1485
1486         /* Now reset the card and some of the device extension data */
1487         if (twl_reset_device_extension(tw_dev, 0)) {
1488                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x15, "Controller reset failed during scsi host reset");
1489                 goto out;
1490         }
1491
1492         retval = SUCCESS;
1493 out:
1494         mutex_unlock(&tw_dev->ioctl_lock);
1495         return retval;
1496 } /* End twl_scsi_eh_reset() */
1497
1498 /* This is the main scsi queue function to handle scsi opcodes */
1499 static int twl_scsi_queue(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
1500 {
1501         int request_id, retval;
1502         TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
1503
1504         /* If we are resetting due to timed out ioctl, report as busy */
1505         if (test_bit(TW_IN_RESET, &tw_dev->flags)) {
1506                 retval = SCSI_MLQUEUE_HOST_BUSY;
1507                 goto out;
1508         }
1509
1510         /* Save done function into scsi_cmnd struct */
1511         SCpnt->scsi_done = done;
1512                 
1513         /* Get a free request id */
1514         twl_get_request_id(tw_dev, &request_id);
1515
1516         /* Save the scsi command for use by the ISR */
1517         tw_dev->srb[request_id] = SCpnt;
1518
1519         /* Initialize phase to zero */
1520         SCpnt->SCp.phase = TW_PHASE_INITIAL;
1521
1522         retval = twl_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL);
1523         if (retval) {
1524                 tw_dev->state[request_id] = TW_S_COMPLETED;
1525                 twl_free_request_id(tw_dev, request_id);
1526                 SCpnt->result = (DID_ERROR << 16);
1527                 done(SCpnt);
1528                 retval = 0;
1529         }
1530 out:
1531         return retval;
1532 } /* End twl_scsi_queue() */
1533
1534 /* This function tells the controller to shut down */
1535 static void __twl_shutdown(TW_Device_Extension *tw_dev)
1536 {
1537         /* Disable interrupts */
1538         TWL_MASK_INTERRUPTS(tw_dev);
1539
1540         /* Free up the IRQ */
1541         free_irq(tw_dev->tw_pci_dev->irq, tw_dev);
1542
1543         printk(KERN_WARNING "3w-sas: Shutting down host %d.\n", tw_dev->host->host_no);
1544
1545         /* Tell the card we are shutting down */
1546         if (twl_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) {
1547                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x16, "Connection shutdown failed");
1548         } else {
1549                 printk(KERN_WARNING "3w-sas: Shutdown complete.\n");
1550         }
1551
1552         /* Clear doorbell interrupt just before exit */
1553         TWL_CLEAR_DB_INTERRUPT(tw_dev);
1554 } /* End __twl_shutdown() */
1555
1556 /* Wrapper for __twl_shutdown */
1557 static void twl_shutdown(struct pci_dev *pdev)
1558 {
1559         struct Scsi_Host *host = pci_get_drvdata(pdev);
1560         TW_Device_Extension *tw_dev;
1561
1562         if (!host)
1563                 return;
1564
1565         tw_dev = (TW_Device_Extension *)host->hostdata;
1566
1567         if (tw_dev->online) 
1568                 __twl_shutdown(tw_dev);
1569 } /* End twl_shutdown() */
1570
1571 /* This function configures unit settings when a unit is coming on-line */
1572 static int twl_slave_configure(struct scsi_device *sdev)
1573 {
1574         /* Force 60 second timeout */
1575         blk_queue_rq_timeout(sdev->request_queue, 60 * HZ);
1576
1577         return 0;
1578 } /* End twl_slave_configure() */
1579
1580 /* scsi_host_template initializer */
1581 static struct scsi_host_template driver_template = {
1582         .module                 = THIS_MODULE,
1583         .name                   = "3w-sas",
1584         .queuecommand           = twl_scsi_queue,
1585         .eh_host_reset_handler  = twl_scsi_eh_reset,
1586         .bios_param             = twl_scsi_biosparam,
1587         .change_queue_depth     = twl_change_queue_depth,
1588         .can_queue              = TW_Q_LENGTH-2,
1589         .slave_configure        = twl_slave_configure,
1590         .this_id                = -1,
1591         .sg_tablesize           = TW_LIBERATOR_MAX_SGL_LENGTH,
1592         .max_sectors            = TW_MAX_SECTORS,
1593         .cmd_per_lun            = TW_MAX_CMDS_PER_LUN,
1594         .use_clustering         = ENABLE_CLUSTERING,
1595         .shost_attrs            = twl_host_attrs,
1596         .emulated               = 1
1597 };
1598
1599 /* This function will probe and initialize a card */
1600 static int __devinit twl_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
1601 {
1602         struct Scsi_Host *host = NULL;
1603         TW_Device_Extension *tw_dev;
1604         int retval = -ENODEV;
1605         int *ptr_phycount, phycount=0;
1606
1607         retval = pci_enable_device(pdev);
1608         if (retval) {
1609                 TW_PRINTK(host, TW_DRIVER, 0x17, "Failed to enable pci device");
1610                 goto out_disable_device;
1611         }
1612
1613         pci_set_master(pdev);
1614         pci_try_set_mwi(pdev);
1615
1616         if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64))
1617             || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))
1618                 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
1619                     || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
1620                         TW_PRINTK(host, TW_DRIVER, 0x18, "Failed to set dma mask");
1621                         retval = -ENODEV;
1622                         goto out_disable_device;
1623                 }
1624
1625         host = scsi_host_alloc(&driver_template, sizeof(TW_Device_Extension));
1626         if (!host) {
1627                 TW_PRINTK(host, TW_DRIVER, 0x19, "Failed to allocate memory for device extension");
1628                 retval = -ENOMEM;
1629                 goto out_disable_device;
1630         }
1631         tw_dev = shost_priv(host);
1632
1633         /* Save values to device extension */
1634         tw_dev->host = host;
1635         tw_dev->tw_pci_dev = pdev;
1636
1637         if (twl_initialize_device_extension(tw_dev)) {
1638                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1a, "Failed to initialize device extension");
1639                 goto out_free_device_extension;
1640         }
1641
1642         /* Request IO regions */
1643         retval = pci_request_regions(pdev, "3w-sas");
1644         if (retval) {
1645                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1b, "Failed to get mem region");
1646                 goto out_free_device_extension;
1647         }
1648
1649         /* Save base address, use region 1 */
1650         tw_dev->base_addr = pci_iomap(pdev, 1, 0);
1651         if (!tw_dev->base_addr) {
1652                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to ioremap");
1653                 goto out_release_mem_region;
1654         }
1655
1656         /* Disable interrupts on the card */
1657         TWL_MASK_INTERRUPTS(tw_dev);
1658
1659         /* Initialize the card */
1660         if (twl_reset_sequence(tw_dev, 0)) {
1661                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1d, "Controller reset failed during probe");
1662                 goto out_iounmap;
1663         }
1664
1665         /* Set host specific parameters */
1666         host->max_id = TW_MAX_UNITS;
1667         host->max_cmd_len = TW_MAX_CDB_LEN;
1668         host->max_lun = TW_MAX_LUNS;
1669         host->max_channel = 0;
1670
1671         /* Register the card with the kernel SCSI layer */
1672         retval = scsi_add_host(host, &pdev->dev);
1673         if (retval) {
1674                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1e, "scsi add host failed");
1675                 goto out_iounmap;
1676         }
1677
1678         pci_set_drvdata(pdev, host);
1679
1680         printk(KERN_WARNING "3w-sas: scsi%d: Found an LSI 3ware %s Controller at 0x%llx, IRQ: %d.\n",
1681                host->host_no,
1682                (char *)twl_get_param(tw_dev, 1, TW_VERSION_TABLE,
1683                                      TW_PARAM_MODEL, TW_PARAM_MODEL_LENGTH),
1684                (u64)pci_resource_start(pdev, 1), pdev->irq);
1685
1686         ptr_phycount = twl_get_param(tw_dev, 2, TW_PARAM_PHY_SUMMARY_TABLE,
1687                                      TW_PARAM_PHYCOUNT, TW_PARAM_PHYCOUNT_LENGTH);
1688         if (ptr_phycount)
1689                 phycount = le32_to_cpu(*(int *)ptr_phycount);
1690
1691         printk(KERN_WARNING "3w-sas: scsi%d: Firmware %s, BIOS %s, Phys: %d.\n",
1692                host->host_no,
1693                (char *)twl_get_param(tw_dev, 1, TW_VERSION_TABLE,
1694                                      TW_PARAM_FWVER, TW_PARAM_FWVER_LENGTH),
1695                (char *)twl_get_param(tw_dev, 2, TW_VERSION_TABLE,
1696                                      TW_PARAM_BIOSVER, TW_PARAM_BIOSVER_LENGTH),
1697                phycount);
1698
1699         /* Try to enable MSI */
1700         if (use_msi && !pci_enable_msi(pdev))
1701                 set_bit(TW_USING_MSI, &tw_dev->flags);
1702
1703         /* Now setup the interrupt handler */
1704         retval = request_irq(pdev->irq, twl_interrupt, IRQF_SHARED, "3w-sas", tw_dev);
1705         if (retval) {
1706                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1f, "Error requesting IRQ");
1707                 goto out_remove_host;
1708         }
1709
1710         twl_device_extension_list[twl_device_extension_count] = tw_dev;
1711         twl_device_extension_count++;
1712
1713         /* Re-enable interrupts on the card */
1714         TWL_UNMASK_INTERRUPTS(tw_dev);
1715         
1716         /* Finally, scan the host */
1717         scsi_scan_host(host);
1718
1719         /* Add sysfs binary files */
1720         if (sysfs_create_bin_file(&host->shost_dev.kobj, &twl_sysfs_aen_read_attr))
1721                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x20, "Failed to create sysfs binary file: 3ware_aen_read");
1722         if (sysfs_create_bin_file(&host->shost_dev.kobj, &twl_sysfs_compat_info_attr))
1723                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x21, "Failed to create sysfs binary file: 3ware_compat_info");
1724
1725         if (twl_major == -1) {
1726                 if ((twl_major = register_chrdev (0, "twl", &twl_fops)) < 0)
1727                         TW_PRINTK(host, TW_DRIVER, 0x22, "Failed to register character device");
1728         }
1729         tw_dev->online = 1;
1730         return 0;
1731
1732 out_remove_host:
1733         if (test_bit(TW_USING_MSI, &tw_dev->flags))
1734                 pci_disable_msi(pdev);
1735         scsi_remove_host(host);
1736 out_iounmap:
1737         iounmap(tw_dev->base_addr);
1738 out_release_mem_region:
1739         pci_release_regions(pdev);
1740 out_free_device_extension:
1741         twl_free_device_extension(tw_dev);
1742         scsi_host_put(host);
1743 out_disable_device:
1744         pci_disable_device(pdev);
1745
1746         return retval;
1747 } /* End twl_probe() */
1748
1749 /* This function is called to remove a device */
1750 static void twl_remove(struct pci_dev *pdev)
1751 {
1752         struct Scsi_Host *host = pci_get_drvdata(pdev);
1753         TW_Device_Extension *tw_dev;
1754
1755         if (!host)
1756                 return;
1757
1758         tw_dev = (TW_Device_Extension *)host->hostdata;
1759
1760         if (!tw_dev->online)
1761                 return;
1762
1763         /* Remove sysfs binary files */
1764         sysfs_remove_bin_file(&host->shost_dev.kobj, &twl_sysfs_aen_read_attr);
1765         sysfs_remove_bin_file(&host->shost_dev.kobj, &twl_sysfs_compat_info_attr);
1766
1767         scsi_remove_host(tw_dev->host);
1768
1769         /* Unregister character device */
1770         if (twl_major >= 0) {
1771                 unregister_chrdev(twl_major, "twl");
1772                 twl_major = -1;
1773         }
1774
1775         /* Shutdown the card */
1776         __twl_shutdown(tw_dev);
1777
1778         /* Disable MSI if enabled */
1779         if (test_bit(TW_USING_MSI, &tw_dev->flags))
1780                 pci_disable_msi(pdev);
1781
1782         /* Free IO remapping */
1783         iounmap(tw_dev->base_addr);
1784
1785         /* Free up the mem region */
1786         pci_release_regions(pdev);
1787
1788         /* Free up device extension resources */
1789         twl_free_device_extension(tw_dev);
1790
1791         scsi_host_put(tw_dev->host);
1792         pci_disable_device(pdev);
1793         twl_device_extension_count--;
1794 } /* End twl_remove() */
1795
1796 #ifdef CONFIG_PM
1797 /* This function is called on PCI suspend */
1798 static int twl_suspend(struct pci_dev *pdev, pm_message_t state)
1799 {
1800         struct Scsi_Host *host = pci_get_drvdata(pdev);
1801         TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
1802
1803         printk(KERN_WARNING "3w-sas: Suspending host %d.\n", tw_dev->host->host_no);
1804         /* Disable interrupts */
1805         TWL_MASK_INTERRUPTS(tw_dev);
1806
1807         free_irq(tw_dev->tw_pci_dev->irq, tw_dev);
1808
1809         /* Tell the card we are shutting down */
1810         if (twl_initconnection(tw_dev, 1, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL)) {
1811                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x23, "Connection shutdown failed during suspend");
1812         } else {
1813                 printk(KERN_WARNING "3w-sas: Suspend complete.\n");
1814         }
1815
1816         /* Clear doorbell interrupt */
1817         TWL_CLEAR_DB_INTERRUPT(tw_dev);
1818
1819         pci_save_state(pdev);
1820         pci_disable_device(pdev);
1821         pci_set_power_state(pdev, pci_choose_state(pdev, state));
1822
1823         return 0;
1824 } /* End twl_suspend() */
1825
1826 /* This function is called on PCI resume */
1827 static int twl_resume(struct pci_dev *pdev)
1828 {
1829         int retval = 0;
1830         struct Scsi_Host *host = pci_get_drvdata(pdev);
1831         TW_Device_Extension *tw_dev = (TW_Device_Extension *)host->hostdata;
1832
1833         printk(KERN_WARNING "3w-sas: Resuming host %d.\n", tw_dev->host->host_no);
1834         pci_set_power_state(pdev, PCI_D0);
1835         pci_enable_wake(pdev, PCI_D0, 0);
1836         pci_restore_state(pdev);
1837
1838         retval = pci_enable_device(pdev);
1839         if (retval) {
1840                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x24, "Enable device failed during resume");
1841                 return retval;
1842         }
1843
1844         pci_set_master(pdev);
1845         pci_try_set_mwi(pdev);
1846
1847         if (pci_set_dma_mask(pdev, DMA_BIT_MASK(64))
1848             || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))
1849                 if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))
1850                     || pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
1851                         TW_PRINTK(host, TW_DRIVER, 0x25, "Failed to set dma mask during resume");
1852                         retval = -ENODEV;
1853                         goto out_disable_device;
1854                 }
1855
1856         /* Initialize the card */
1857         if (twl_reset_sequence(tw_dev, 0)) {
1858                 retval = -ENODEV;
1859                 goto out_disable_device;
1860         }
1861
1862         /* Now setup the interrupt handler */
1863         retval = request_irq(pdev->irq, twl_interrupt, IRQF_SHARED, "3w-sas", tw_dev);
1864         if (retval) {
1865                 TW_PRINTK(tw_dev->host, TW_DRIVER, 0x26, "Error requesting IRQ during resume");
1866                 retval = -ENODEV;
1867                 goto out_disable_device;
1868         }
1869
1870         /* Now enable MSI if enabled */
1871         if (test_bit(TW_USING_MSI, &tw_dev->flags))
1872                 pci_enable_msi(pdev);
1873
1874         /* Re-enable interrupts on the card */
1875         TWL_UNMASK_INTERRUPTS(tw_dev);
1876
1877         printk(KERN_WARNING "3w-sas: Resume complete.\n");
1878         return 0;
1879
1880 out_disable_device:
1881         scsi_remove_host(host);
1882         pci_disable_device(pdev);
1883
1884         return retval;
1885 } /* End twl_resume() */
1886 #endif
1887
1888 /* PCI Devices supported by this driver */
1889 static struct pci_device_id twl_pci_tbl[] __devinitdata = {
1890         { PCI_VDEVICE(3WARE, PCI_DEVICE_ID_3WARE_9750) },
1891         { }
1892 };
1893 MODULE_DEVICE_TABLE(pci, twl_pci_tbl);
1894
1895 /* pci_driver initializer */
1896 static struct pci_driver twl_driver = {
1897         .name           = "3w-sas",
1898         .id_table       = twl_pci_tbl,
1899         .probe          = twl_probe,
1900         .remove         = twl_remove,
1901 #ifdef CONFIG_PM
1902         .suspend        = twl_suspend,
1903         .resume         = twl_resume,
1904 #endif
1905         .shutdown       = twl_shutdown
1906 };
1907
1908 /* This function is called on driver initialization */
1909 static int __init twl_init(void)
1910 {
1911         printk(KERN_INFO "LSI 3ware SAS/SATA-RAID Controller device driver for Linux v%s.\n", TW_DRIVER_VERSION);
1912
1913         return pci_register_driver(&twl_driver);
1914 } /* End twl_init() */
1915
1916 /* This function is called on driver exit */
1917 static void __exit twl_exit(void)
1918 {
1919         pci_unregister_driver(&twl_driver);
1920 } /* End twl_exit() */
1921
1922 module_init(twl_init);
1923 module_exit(twl_exit);
1924