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 1925