1 /* 2 * linux/drivers/message/fusion/mptfc.c 3 * For use with LSI PCI chip/adapter(s) 4 * running LSI Fusion MPT (Message Passing Technology) firmware. 5 * 6 * Copyright (c) 1999-2007 LSI Corporation 7 * (mailto:DL-MPTFusionLinux@lsi.com) 8 * 9 */ 10 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 11 /* 12 This program is free software; you can redistribute it and/or modify 13 it under the terms of the GNU General Public License as published by 14 the Free Software Foundation; version 2 of the License. 15 16 This program is distributed in the hope that it will be useful, 17 but WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 GNU General Public License for more details. 20 21 NO WARRANTY 22 THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR 23 CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT 24 LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, 25 MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is 26 solely responsible for determining the appropriateness of using and 27 distributing the Program and assumes all risks associated with its 28 exercise of rights under this Agreement, including but not limited to 29 the risks and costs of program errors, damage to or loss of data, 30 programs or equipment, and unavailability or interruption of operations. 31 32 DISCLAIMER OF LIABILITY 33 NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY 34 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 35 DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND 36 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 37 TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 38 USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED 39 HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES 40 41 You should have received a copy of the GNU General Public License 42 along with this program; if not, write to the Free Software 43 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 44 */ 45 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 46 #include <linux/module.h> 47 #include <linux/kernel.h> 48 #include <linux/init.h> 49 #include <linux/errno.h> 50 #include <linux/kdev_t.h> 51 #include <linux/blkdev.h> 52 #include <linux/delay.h> /* for mdelay */ 53 #include <linux/interrupt.h> /* needed for in_interrupt() proto */ 54 #include <linux/reboot.h> /* notifier code */ 55 #include <linux/workqueue.h> 56 #include <linux/sort.h> 57 58 #include <scsi/scsi.h> 59 #include <scsi/scsi_cmnd.h> 60 #include <scsi/scsi_device.h> 61 #include <scsi/scsi_host.h> 62 #include <scsi/scsi_tcq.h> 63 #include <scsi/scsi_transport_fc.h> 64 65 #include "mptbase.h" 66 #include "mptscsih.h" 67 68 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 69 #define my_NAME "Fusion MPT FC Host driver" 70 #define my_VERSION MPT_LINUX_VERSION_COMMON 71 #define MYNAM "mptfc" 72 73 MODULE_AUTHOR(MODULEAUTHOR); 74 MODULE_DESCRIPTION(my_NAME); 75 MODULE_LICENSE("GPL"); 76 MODULE_VERSION(my_VERSION); 77 78 /* Command line args */ 79 #define MPTFC_DEV_LOSS_TMO (60) 80 static int mptfc_dev_loss_tmo = MPTFC_DEV_LOSS_TMO; /* reasonable default */ 81 module_param(mptfc_dev_loss_tmo, int, 0); 82 MODULE_PARM_DESC(mptfc_dev_loss_tmo, " Initial time the driver programs the " 83 " transport to wait for an rport to " 84 " return following a device loss event." 85 " Default=60."); 86 87 /* scsi-mid layer global parmeter is max_report_luns, which is 511 */ 88 #define MPTFC_MAX_LUN (16895) 89 static int max_lun = MPTFC_MAX_LUN; 90 module_param(max_lun, int, 0); 91 MODULE_PARM_DESC(max_lun, " max lun, default=16895 "); 92 93 static u8 mptfcDoneCtx = MPT_MAX_PROTOCOL_DRIVERS; 94 static u8 mptfcTaskCtx = MPT_MAX_PROTOCOL_DRIVERS; 95 static u8 mptfcInternalCtx = MPT_MAX_PROTOCOL_DRIVERS; 96 97 static int mptfc_target_alloc(struct scsi_target *starget); 98 static int mptfc_slave_alloc(struct scsi_device *sdev); 99 static int mptfc_qcmd(struct scsi_cmnd *SCpnt, 100 void (*done)(struct scsi_cmnd *)); 101 static void mptfc_target_destroy(struct scsi_target *starget); 102 static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout); 103 static void __devexit mptfc_remove(struct pci_dev *pdev); 104 static int mptfc_abort(struct scsi_cmnd *SCpnt); 105 static int mptfc_dev_reset(struct scsi_cmnd *SCpnt); 106 static int mptfc_bus_reset(struct scsi_cmnd *SCpnt); 107 static int mptfc_host_reset(struct scsi_cmnd *SCpnt); 108 109 static struct scsi_host_template mptfc_driver_template = { 110 .module = THIS_MODULE, 111 .proc_name = "mptfc", 112 .proc_info = mptscsih_proc_info, 113 .name = "MPT FC Host", 114 .info = mptscsih_info, 115 .queuecommand = mptfc_qcmd, 116 .target_alloc = mptfc_target_alloc, 117 .slave_alloc = mptfc_slave_alloc, 118 .slave_configure = mptscsih_slave_configure, 119 .target_destroy = mptfc_target_destroy, 120 .slave_destroy = mptscsih_slave_destroy, 121 .change_queue_depth = mptscsih_change_queue_depth, 122 .eh_abort_handler = mptfc_abort, 123 .eh_device_reset_handler = mptfc_dev_reset, 124 .eh_bus_reset_handler = mptfc_bus_reset, 125 .eh_host_reset_handler = mptfc_host_reset, 126 .bios_param = mptscsih_bios_param, 127 .can_queue = MPT_FC_CAN_QUEUE, 128 .this_id = -1, 129 .sg_tablesize = MPT_SCSI_SG_DEPTH, 130 .max_sectors = 8192, 131 .cmd_per_lun = 7, 132 .use_clustering = ENABLE_CLUSTERING, 133 .shost_attrs = mptscsih_host_attrs, 134 }; 135 136 /**************************************************************************** 137 * Supported hardware 138 */ 139 140 static struct pci_device_id mptfc_pci_table[] = { 141 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC909, 142 PCI_ANY_ID, PCI_ANY_ID }, 143 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC919, 144 PCI_ANY_ID, PCI_ANY_ID }, 145 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC929, 146 PCI_ANY_ID, PCI_ANY_ID }, 147 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC919X, 148 PCI_ANY_ID, PCI_ANY_ID }, 149 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC929X, 150 PCI_ANY_ID, PCI_ANY_ID }, 151 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC939X, 152 PCI_ANY_ID, PCI_ANY_ID }, 153 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC949X, 154 PCI_ANY_ID, PCI_ANY_ID }, 155 { PCI_VENDOR_ID_LSI_LOGIC, MPI_MANUFACTPAGE_DEVICEID_FC949E, 156 PCI_ANY_ID, PCI_ANY_ID }, 157 { PCI_VENDOR_ID_BROCADE, MPI_MANUFACTPAGE_DEVICEID_FC949E, 158 PCI_ANY_ID, PCI_ANY_ID }, 159 {0} /* Terminating entry */ 160 }; 161 MODULE_DEVICE_TABLE(pci, mptfc_pci_table); 162 163 static struct scsi_transport_template *mptfc_transport_template = NULL; 164 165 static struct fc_function_template mptfc_transport_functions = { 166 .dd_fcrport_size = 8, 167 .show_host_node_name = 1, 168 .show_host_port_name = 1, 169 .show_host_supported_classes = 1, 170 .show_host_port_id = 1, 171 .show_rport_supported_classes = 1, 172 .show_starget_node_name = 1, 173 .show_starget_port_name = 1, 174 .show_starget_port_id = 1, 175 .set_rport_dev_loss_tmo = mptfc_set_rport_loss_tmo, 176 .show_rport_dev_loss_tmo = 1, 177 .show_host_supported_speeds = 1, 178 .show_host_maxframe_size = 1, 179 .show_host_speed = 1, 180 .show_host_fabric_name = 1, 181 .show_host_port_type = 1, 182 .show_host_port_state = 1, 183 .show_host_symbolic_name = 1, 184 }; 185 186 static int 187 mptfc_block_error_handler(struct scsi_cmnd *SCpnt, 188 int (*func)(struct scsi_cmnd *SCpnt), 189 const char *caller) 190 { 191 MPT_SCSI_HOST *hd; 192 struct scsi_device *sdev = SCpnt->device; 193 struct Scsi_Host *shost = sdev->host; 194 struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); 195 unsigned long flags; 196 int ready; 197 198 hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata; 199 spin_lock_irqsave(shost->host_lock, flags); 200 while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) { 201 spin_unlock_irqrestore(shost->host_lock, flags); 202 dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT 203 "mptfc_block_error_handler.%d: %d:%d, port status is " 204 "DID_IMM_RETRY, deferring %s recovery.\n", 205 ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, 206 ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, 207 SCpnt->device->id,SCpnt->device->lun,caller)); 208 msleep(1000); 209 spin_lock_irqsave(shost->host_lock, flags); 210 } 211 spin_unlock_irqrestore(shost->host_lock, flags); 212 213 if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) { 214 dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT 215 "%s.%d: %d:%d, failing recovery, " 216 "port state %d, vdev %p.\n", caller, 217 ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, 218 ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, 219 SCpnt->device->id,SCpnt->device->lun,ready, 220 SCpnt->device->hostdata)); 221 return FAILED; 222 } 223 dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT 224 "%s.%d: %d:%d, executing recovery.\n", caller, 225 ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, 226 ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, 227 SCpnt->device->id,SCpnt->device->lun)); 228 return (*func)(SCpnt); 229 } 230 231 static int 232 mptfc_abort(struct scsi_cmnd *SCpnt) 233 { 234 return 235 mptfc_block_error_handler(SCpnt, mptscsih_abort, __FUNCTION__); 236 } 237 238 static int 239 mptfc_dev_reset(struct scsi_cmnd *SCpnt) 240 { 241 return 242 mptfc_block_error_handler(SCpnt, mptscsih_dev_reset, __FUNCTION__); 243 } 244 245 static int 246 mptfc_bus_reset(struct scsi_cmnd *SCpnt) 247 { 248 return 249 mptfc_block_error_handler(SCpnt, mptscsih_bus_reset, __FUNCTION__); 250 } 251 252 static int 253 mptfc_host_reset(struct scsi_cmnd *SCpnt) 254 { 255 return 256 mptfc_block_error_handler(SCpnt, mptscsih_host_reset, __FUNCTION__); 257 } 258 259 static void 260 mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) 261 { 262 if (timeout > 0) 263 rport->dev_loss_tmo = timeout; 264 else 265 rport->dev_loss_tmo = mptfc_dev_loss_tmo; 266 } 267 268 static int 269 mptfc_FcDevPage0_cmp_func(const void *a, const void *b) 270 { 271 FCDevicePage0_t **aa = (FCDevicePage0_t **)a; 272 FCDevicePage0_t **bb = (FCDevicePage0_t **)b; 273 274 if ((*aa)->CurrentBus == (*bb)->CurrentBus) { 275 if ((*aa)->CurrentTargetID == (*bb)->CurrentTargetID) 276 return 0; 277 if ((*aa)->CurrentTargetID < (*bb)->CurrentTargetID) 278 return -1; 279 return 1; 280 } 281 if ((*aa)->CurrentBus < (*bb)->CurrentBus) 282 return -1; 283 return 1; 284 } 285 286 static int 287 mptfc_GetFcDevPage0(MPT_ADAPTER *ioc, int ioc_port, 288 void(*func)(MPT_ADAPTER *ioc,int channel, FCDevicePage0_t *arg)) 289 { 290 ConfigPageHeader_t hdr; 291 CONFIGPARMS cfg; 292 FCDevicePage0_t *ppage0_alloc, *fc; 293 dma_addr_t page0_dma; 294 int data_sz; 295 int ii; 296 297 FCDevicePage0_t *p0_array=NULL, *p_p0; 298 FCDevicePage0_t **pp0_array=NULL, **p_pp0; 299 300 int rc = -ENOMEM; 301 U32 port_id = 0xffffff; 302 int num_targ = 0; 303 int max_bus = ioc->facts.MaxBuses; 304 int max_targ; 305 306 max_targ = (ioc->facts.MaxDevices == 0) ? 256 : ioc->facts.MaxDevices; 307 308 data_sz = sizeof(FCDevicePage0_t) * max_bus * max_targ; 309 p_p0 = p0_array = kzalloc(data_sz, GFP_KERNEL); 310 if (!p0_array) 311 goto out; 312 313 data_sz = sizeof(FCDevicePage0_t *) * max_bus * max_targ; 314 p_pp0 = pp0_array = kzalloc(data_sz, GFP_KERNEL); 315 if (!pp0_array) 316 goto out; 317 318 do { 319 /* Get FC Device Page 0 header */ 320 hdr.PageVersion = 0; 321 hdr.PageLength = 0; 322 hdr.PageNumber = 0; 323 hdr.PageType = MPI_CONFIG_PAGETYPE_FC_DEVICE; 324 cfg.cfghdr.hdr = &hdr; 325 cfg.physAddr = -1; 326 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; 327 cfg.dir = 0; 328 cfg.pageAddr = port_id; 329 cfg.timeout = 0; 330 331 if ((rc = mpt_config(ioc, &cfg)) != 0) 332 break; 333 334 if (hdr.PageLength <= 0) 335 break; 336 337 data_sz = hdr.PageLength * 4; 338 ppage0_alloc = pci_alloc_consistent(ioc->pcidev, data_sz, 339 &page0_dma); 340 rc = -ENOMEM; 341 if (!ppage0_alloc) 342 break; 343 344 cfg.physAddr = page0_dma; 345 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; 346 347 if ((rc = mpt_config(ioc, &cfg)) == 0) { 348 ppage0_alloc->PortIdentifier = 349 le32_to_cpu(ppage0_alloc->PortIdentifier); 350 351 ppage0_alloc->WWNN.Low = 352 le32_to_cpu(ppage0_alloc->WWNN.Low); 353 354 ppage0_alloc->WWNN.High = 355 le32_to_cpu(ppage0_alloc->WWNN.High); 356 357 ppage0_alloc->WWPN.Low = 358 le32_to_cpu(ppage0_alloc->WWPN.Low); 359 360 ppage0_alloc->WWPN.High = 361 le32_to_cpu(ppage0_alloc->WWPN.High); 362 363 ppage0_alloc->BBCredit = 364 le16_to_cpu(ppage0_alloc->BBCredit); 365 366 ppage0_alloc->MaxRxFrameSize = 367 le16_to_cpu(ppage0_alloc->MaxRxFrameSize); 368 369 port_id = ppage0_alloc->PortIdentifier; 370 num_targ++; 371 *p_p0 = *ppage0_alloc; /* save data */ 372 *p_pp0++ = p_p0++; /* save addr */ 373 } 374 pci_free_consistent(ioc->pcidev, data_sz, 375 (u8 *) ppage0_alloc, page0_dma); 376 if (rc != 0) 377 break; 378 379 } while (port_id <= 0xff0000); 380 381 if (num_targ) { 382 /* sort array */ 383 if (num_targ > 1) 384 sort (pp0_array, num_targ, sizeof(FCDevicePage0_t *), 385 mptfc_FcDevPage0_cmp_func, NULL); 386 /* call caller's func for each targ */ 387 for (ii = 0; ii < num_targ; ii++) { 388 fc = *(pp0_array+ii); 389 func(ioc, ioc_port, fc); 390 } 391 } 392 393 out: 394 kfree(pp0_array); 395 kfree(p0_array); 396 return rc; 397 } 398 399 static int 400 mptfc_generate_rport_ids(FCDevicePage0_t *pg0, struct fc_rport_identifiers *rid) 401 { 402 /* not currently usable */ 403 if (pg0->Flags & (MPI_FC_DEVICE_PAGE0_FLAGS_PLOGI_INVALID | 404 MPI_FC_DEVICE_PAGE0_FLAGS_PRLI_INVALID)) 405 return -1; 406 407 if (!(pg0->Flags & MPI_FC_DEVICE_PAGE0_FLAGS_TARGETID_BUS_VALID)) 408 return -1; 409 410 if (!(pg0->Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_TARGET)) 411 return -1; 412 413 /* 414 * board data structure already normalized to platform endianness 415 * shifted to avoid unaligned access on 64 bit architecture 416 */ 417 rid->node_name = ((u64)pg0->WWNN.High) << 32 | (u64)pg0->WWNN.Low; 418 rid->port_name = ((u64)pg0->WWPN.High) << 32 | (u64)pg0->WWPN.Low; 419 rid->port_id = pg0->PortIdentifier; 420 rid->roles = FC_RPORT_ROLE_UNKNOWN; 421 422 return 0; 423 } 424 425 static void 426 mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0) 427 { 428 struct fc_rport_identifiers rport_ids; 429 struct fc_rport *rport; 430 struct mptfc_rport_info *ri; 431 int new_ri = 1; 432 u64 pn, nn; 433 VirtTarget *vtarget; 434 u32 roles = FC_RPORT_ROLE_UNKNOWN; 435 436 if (mptfc_generate_rport_ids(pg0, &rport_ids) < 0) 437 return; 438 439 roles |= FC_RPORT_ROLE_FCP_TARGET; 440 if (pg0->Protocol & MPI_FC_DEVICE_PAGE0_PROT_FCP_INITIATOR) 441 roles |= FC_RPORT_ROLE_FCP_INITIATOR; 442 443 /* scan list looking for a match */ 444 list_for_each_entry(ri, &ioc->fc_rports, list) { 445 pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; 446 if (pn == rport_ids.port_name) { /* match */ 447 list_move_tail(&ri->list, &ioc->fc_rports); 448 new_ri = 0; 449 break; 450 } 451 } 452 if (new_ri) { /* allocate one */ 453 ri = kzalloc(sizeof(struct mptfc_rport_info), GFP_KERNEL); 454 if (!ri) 455 return; 456 list_add_tail(&ri->list, &ioc->fc_rports); 457 } 458 459 ri->pg0 = *pg0; /* add/update pg0 data */ 460 ri->flags &= ~MPT_RPORT_INFO_FLAGS_MISSING; 461 462 /* MPT_RPORT_INFO_FLAGS_REGISTERED - rport not previously deleted */ 463 if (!(ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED)) { 464 ri->flags |= MPT_RPORT_INFO_FLAGS_REGISTERED; 465 rport = fc_remote_port_add(ioc->sh, channel, &rport_ids); 466 if (rport) { 467 ri->rport = rport; 468 if (new_ri) /* may have been reset by user */ 469 rport->dev_loss_tmo = mptfc_dev_loss_tmo; 470 /* 471 * if already mapped, remap here. If not mapped, 472 * target_alloc will allocate vtarget and map, 473 * slave_alloc will fill in vdev from vtarget. 474 */ 475 if (ri->starget) { 476 vtarget = ri->starget->hostdata; 477 if (vtarget) { 478 vtarget->id = pg0->CurrentTargetID; 479 vtarget->channel = pg0->CurrentBus; 480 } 481 } 482 *((struct mptfc_rport_info **)rport->dd_data) = ri; 483 /* scan will be scheduled once rport becomes a target */ 484 fc_remote_port_rolechg(rport,roles); 485 486 pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; 487 nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; 488 dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT 489 "mptfc_reg_dev.%d: %x, %llx / %llx, tid %d, " 490 "rport tid %d, tmo %d\n", 491 ioc->name, 492 ioc->sh->host_no, 493 pg0->PortIdentifier, 494 (unsigned long long)nn, 495 (unsigned long long)pn, 496 pg0->CurrentTargetID, 497 ri->rport->scsi_target_id, 498 ri->rport->dev_loss_tmo)); 499 } else { 500 list_del(&ri->list); 501 kfree(ri); 502 ri = NULL; 503 } 504 } 505 } 506 507 /* 508 * OS entry point to allow for host driver to free allocated memory 509 * Called if no device present or device being unloaded 510 */ 511 static void 512 mptfc_target_destroy(struct scsi_target *starget) 513 { 514 struct fc_rport *rport; 515 struct mptfc_rport_info *ri; 516 517 rport = starget_to_rport(starget); 518 if (rport) { 519 ri = *((struct mptfc_rport_info **)rport->dd_data); 520 if (ri) /* better be! */ 521 ri->starget = NULL; 522 } 523 if (starget->hostdata) 524 kfree(starget->hostdata); 525 starget->hostdata = NULL; 526 } 527 528 /* 529 * OS entry point to allow host driver to alloc memory 530 * for each scsi target. Called once per device the bus scan. 531 * Return non-zero if allocation fails. 532 */ 533 static int 534 mptfc_target_alloc(struct scsi_target *starget) 535 { 536 VirtTarget *vtarget; 537 struct fc_rport *rport; 538 struct mptfc_rport_info *ri; 539 int rc; 540 541 vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL); 542 if (!vtarget) 543 return -ENOMEM; 544 starget->hostdata = vtarget; 545 546 rc = -ENODEV; 547 rport = starget_to_rport(starget); 548 if (rport) { 549 ri = *((struct mptfc_rport_info **)rport->dd_data); 550 if (ri) { /* better be! */ 551 vtarget->id = ri->pg0.CurrentTargetID; 552 vtarget->channel = ri->pg0.CurrentBus; 553 ri->starget = starget; 554 rc = 0; 555 } 556 } 557 if (rc != 0) { 558 kfree(vtarget); 559 starget->hostdata = NULL; 560 } 561 562 return rc; 563 } 564 /* 565 * mptfc_dump_lun_info 566 * @ioc 567 * @rport 568 * @sdev 569 * 570 */ 571 static void 572 mptfc_dump_lun_info(MPT_ADAPTER *ioc, struct fc_rport *rport, struct scsi_device *sdev, 573 VirtTarget *vtarget) 574 { 575 u64 nn, pn; 576 struct mptfc_rport_info *ri; 577 578 ri = *((struct mptfc_rport_info **)rport->dd_data); 579 pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; 580 nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; 581 dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT 582 "mptfc_slv_alloc.%d: num_luns %d, sdev.id %d, " 583 "CurrentTargetID %d, %x %llx %llx\n", 584 ioc->name, 585 sdev->host->host_no, 586 vtarget->num_luns, 587 sdev->id, ri->pg0.CurrentTargetID, 588 ri->pg0.PortIdentifier, 589 (unsigned long long)pn, 590 (unsigned long long)nn)); 591 } 592 593 594 /* 595 * OS entry point to allow host driver to alloc memory 596 * for each scsi device. Called once per device the bus scan. 597 * Return non-zero if allocation fails. 598 * Init memory once per LUN. 599 */ 600 static int 601 mptfc_slave_alloc(struct scsi_device *sdev) 602 { 603 MPT_SCSI_HOST *hd; 604 VirtTarget *vtarget; 605 VirtDevice *vdev; 606 struct scsi_target *starget; 607 struct fc_rport *rport; 608 609 610 starget = scsi_target(sdev); 611 rport = starget_to_rport(starget); 612 613 if (!rport || fc_remote_port_chkready(rport)) 614 return -ENXIO; 615 616 hd = (MPT_SCSI_HOST *)sdev->host->hostdata; 617 618 vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL); 619 if (!vdev) { 620 printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n", 621 hd->ioc->name, sizeof(VirtDevice)); 622 return -ENOMEM; 623 } 624 625 626 sdev->hostdata = vdev; 627 vtarget = starget->hostdata; 628 629 if (vtarget->num_luns == 0) { 630 vtarget->ioc_id = hd->ioc->id; 631 vtarget->tflags = MPT_TARGET_FLAGS_Q_YES; 632 } 633 634 vdev->vtarget = vtarget; 635 vdev->lun = sdev->lun; 636 637 vtarget->num_luns++; 638 639 640 mptfc_dump_lun_info(hd->ioc, rport, sdev, vtarget); 641 642 return 0; 643 } 644 645 static int 646 mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) 647 { 648 struct mptfc_rport_info *ri; 649 struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device)); 650 int err; 651 VirtDevice *vdev = SCpnt->device->hostdata; 652 653 if (!vdev || !vdev->vtarget) { 654 SCpnt->result = DID_NO_CONNECT << 16; 655 done(SCpnt); 656 return 0; 657 } 658 659 err = fc_remote_port_chkready(rport); 660 if (unlikely(err)) { 661 SCpnt->result = err; 662 done(SCpnt); 663 return 0; 664 } 665 666 /* dd_data is null until finished adding target */ 667 ri = *((struct mptfc_rport_info **)rport->dd_data); 668 if (unlikely(!ri)) { 669 SCpnt->result = DID_IMM_RETRY << 16; 670 done(SCpnt); 671 return 0; 672 } 673 674 return mptscsih_qcmd(SCpnt,done); 675 } 676 677 /* 678 * mptfc_display_port_link_speed - displaying link speed 679 * @ioc: Pointer to MPT_ADAPTER structure 680 * @portnum: IOC Port number 681 * @pp0dest: port page0 data payload 682 * 683 */ 684 static void 685 mptfc_display_port_link_speed(MPT_ADAPTER *ioc, int portnum, FCPortPage0_t *pp0dest) 686 { 687 u8 old_speed, new_speed, state; 688 char *old, *new; 689 690 if (portnum >= 2) 691 return; 692 693 old_speed = ioc->fc_link_speed[portnum]; 694 new_speed = pp0dest->CurrentSpeed; 695 state = pp0dest->PortState; 696 697 if (state != MPI_FCPORTPAGE0_PORTSTATE_OFFLINE && 698 new_speed != MPI_FCPORTPAGE0_CURRENT_SPEED_UKNOWN) { 699 700 old = old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT ? "1 Gbps" : 701 old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT ? "2 Gbps" : 702 old_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT ? "4 Gbps" : 703 "Unknown"; 704 new = new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT ? "1 Gbps" : 705 new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT ? "2 Gbps" : 706 new_speed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT ? "4 Gbps" : 707 "Unknown"; 708 if (old_speed == 0) 709 printk(MYIOC_s_NOTE_FMT 710 "FC Link Established, Speed = %s\n", 711 ioc->name, new); 712 else if (old_speed != new_speed) 713 printk(MYIOC_s_WARN_FMT 714 "FC Link Speed Change, Old Speed = %s, New Speed = %s\n", 715 ioc->name, old, new); 716 717 ioc->fc_link_speed[portnum] = new_speed; 718 } 719 } 720 721 /* 722 * mptfc_GetFcPortPage0 - Fetch FCPort config Page0. 723 * @ioc: Pointer to MPT_ADAPTER structure 724 * @portnum: IOC Port number 725 * 726 * Return: 0 for success 727 * -ENOMEM if no memory available 728 * -EPERM if not allowed due to ISR context 729 * -EAGAIN if no msg frames currently available 730 * -EFAULT for non-successful reply or no reply (timeout) 731 * -EINVAL portnum arg out of range (hardwired to two elements) 732 */ 733 static int 734 mptfc_GetFcPortPage0(MPT_ADAPTER *ioc, int portnum) 735 { 736 ConfigPageHeader_t hdr; 737 CONFIGPARMS cfg; 738 FCPortPage0_t *ppage0_alloc; 739 FCPortPage0_t *pp0dest; 740 dma_addr_t page0_dma; 741 int data_sz; 742 int copy_sz; 743 int rc; 744 int count = 400; 745 746 if (portnum > 1) 747 return -EINVAL; 748 749 /* Get FCPort Page 0 header */ 750 hdr.PageVersion = 0; 751 hdr.PageLength = 0; 752 hdr.PageNumber = 0; 753 hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT; 754 cfg.cfghdr.hdr = &hdr; 755 cfg.physAddr = -1; 756 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; 757 cfg.dir = 0; 758 cfg.pageAddr = portnum; 759 cfg.timeout = 0; 760 761 if ((rc = mpt_config(ioc, &cfg)) != 0) 762 return rc; 763 764 if (hdr.PageLength == 0) 765 return 0; 766 767 data_sz = hdr.PageLength * 4; 768 rc = -ENOMEM; 769 ppage0_alloc = (FCPortPage0_t *) pci_alloc_consistent(ioc->pcidev, data_sz, &page0_dma); 770 if (ppage0_alloc) { 771 772 try_again: 773 memset((u8 *)ppage0_alloc, 0, data_sz); 774 cfg.physAddr = page0_dma; 775 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; 776 777 if ((rc = mpt_config(ioc, &cfg)) == 0) { 778 /* save the data */ 779 pp0dest = &ioc->fc_port_page0[portnum]; 780 copy_sz = min_t(int, sizeof(FCPortPage0_t), data_sz); 781 memcpy(pp0dest, ppage0_alloc, copy_sz); 782 783 /* 784 * Normalize endianness of structure data, 785 * by byte-swapping all > 1 byte fields! 786 */ 787 pp0dest->Flags = le32_to_cpu(pp0dest->Flags); 788 pp0dest->PortIdentifier = le32_to_cpu(pp0dest->PortIdentifier); 789 pp0dest->WWNN.Low = le32_to_cpu(pp0dest->WWNN.Low); 790 pp0dest->WWNN.High = le32_to_cpu(pp0dest->WWNN.High); 791 pp0dest->WWPN.Low = le32_to_cpu(pp0dest->WWPN.Low); 792 pp0dest->WWPN.High = le32_to_cpu(pp0dest->WWPN.High); 793 pp0dest->SupportedServiceClass = le32_to_cpu(pp0dest->SupportedServiceClass); 794 pp0dest->SupportedSpeeds = le32_to_cpu(pp0dest->SupportedSpeeds); 795 pp0dest->CurrentSpeed = le32_to_cpu(pp0dest->CurrentSpeed); 796 pp0dest->MaxFrameSize = le32_to_cpu(pp0dest->MaxFrameSize); 797 pp0dest->FabricWWNN.Low = le32_to_cpu(pp0dest->FabricWWNN.Low); 798 pp0dest->FabricWWNN.High = le32_to_cpu(pp0dest->FabricWWNN.High); 799 pp0dest->FabricWWPN.Low = le32_to_cpu(pp0dest->FabricWWPN.Low); 800 pp0dest->FabricWWPN.High = le32_to_cpu(pp0dest->FabricWWPN.High); 801 pp0dest->DiscoveredPortsCount = le32_to_cpu(pp0dest->DiscoveredPortsCount); 802 pp0dest->MaxInitiators = le32_to_cpu(pp0dest->MaxInitiators); 803 804 /* 805 * if still doing discovery, 806 * hang loose a while until finished 807 */ 808 if ((pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_UNKNOWN) || 809 (pp0dest->PortState == MPI_FCPORTPAGE0_PORTSTATE_ONLINE && 810 (pp0dest->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_TYPE_MASK) 811 == MPI_FCPORTPAGE0_FLAGS_ATTACH_NO_INIT)) { 812 if (count-- > 0) { 813 msleep(100); 814 goto try_again; 815 } 816 printk(MYIOC_s_INFO_FMT "Firmware discovery not" 817 " complete.\n", 818 ioc->name); 819 } 820 mptfc_display_port_link_speed(ioc, portnum, pp0dest); 821 } 822 823 pci_free_consistent(ioc->pcidev, data_sz, (u8 *) ppage0_alloc, page0_dma); 824 } 825 826 return rc; 827 } 828 829 static int 830 mptfc_WriteFcPortPage1(MPT_ADAPTER *ioc, int portnum) 831 { 832 ConfigPageHeader_t hdr; 833 CONFIGPARMS cfg; 834 int rc; 835 836 if (portnum > 1) 837 return -EINVAL; 838 839 if (!(ioc->fc_data.fc_port_page1[portnum].data)) 840 return -EINVAL; 841 842 /* get fcport page 1 header */ 843 hdr.PageVersion = 0; 844 hdr.PageLength = 0; 845 hdr.PageNumber = 1; 846 hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT; 847 cfg.cfghdr.hdr = &hdr; 848 cfg.physAddr = -1; 849 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; 850 cfg.dir = 0; 851 cfg.pageAddr = portnum; 852 cfg.timeout = 0; 853 854 if ((rc = mpt_config(ioc, &cfg)) != 0) 855 return rc; 856 857 if (hdr.PageLength == 0) 858 return -ENODEV; 859 860 if (hdr.PageLength*4 != ioc->fc_data.fc_port_page1[portnum].pg_sz) 861 return -EINVAL; 862 863 cfg.physAddr = ioc->fc_data.fc_port_page1[portnum].dma; 864 cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT; 865 cfg.dir = 1; 866 867 rc = mpt_config(ioc, &cfg); 868 869 return rc; 870 } 871 872 static int 873 mptfc_GetFcPortPage1(MPT_ADAPTER *ioc, int portnum) 874 { 875 ConfigPageHeader_t hdr; 876 CONFIGPARMS cfg; 877 FCPortPage1_t *page1_alloc; 878 dma_addr_t page1_dma; 879 int data_sz; 880 int rc; 881 882 if (portnum > 1) 883 return -EINVAL; 884 885 /* get fcport page 1 header */ 886 hdr.PageVersion = 0; 887 hdr.PageLength = 0; 888 hdr.PageNumber = 1; 889 hdr.PageType = MPI_CONFIG_PAGETYPE_FC_PORT; 890 cfg.cfghdr.hdr = &hdr; 891 cfg.physAddr = -1; 892 cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; 893 cfg.dir = 0; 894 cfg.pageAddr = portnum; 895 cfg.timeout = 0; 896 897 if ((rc = mpt_config(ioc, &cfg)) != 0) 898 return rc; 899 900 if (hdr.PageLength == 0) 901 return -ENODEV; 902 903 start_over: 904 905 if (ioc->fc_data.fc_port_page1[portnum].data == NULL) { 906 data_sz = hdr.PageLength * 4; 907 if (data_sz < sizeof(FCPortPage1_t)) 908 data_sz = sizeof(FCPortPage1_t); 909 910 page1_alloc = (FCPortPage1_t *) pci_alloc_consistent(ioc->pcidev, 911 data_sz, 912 &page1_dma); 913 if (!page1_alloc) 914 return -ENOMEM; 915 } 916 else { 917 page1_alloc = ioc->fc_data.fc_port_page1[portnum].data; 918 page1_dma = ioc->fc_data.fc_port_page1[portnum].dma; 919 data_sz = ioc->fc_data.fc_port_page1[portnum].pg_sz; 920 if (hdr.PageLength * 4 > data_sz) { 921 ioc->fc_data.fc_port_page1[portnum].data = NULL; 922 pci_free_consistent(ioc->pcidev, data_sz, (u8 *) 923 page1_alloc, page1_dma); 924 goto start_over; 925 } 926 } 927 928 memset(page1_alloc,0,data_sz); 929 930 cfg.physAddr = page1_dma; 931 cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; 932 933 if ((rc = mpt_config(ioc, &cfg)) == 0) { 934 ioc->fc_data.fc_port_page1[portnum].data = page1_alloc; 935 ioc->fc_data.fc_port_page1[portnum].pg_sz = data_sz; 936 ioc->fc_data.fc_port_page1[portnum].dma = page1_dma; 937 } 938 else { 939 ioc->fc_data.fc_port_page1[portnum].data = NULL; 940 pci_free_consistent(ioc->pcidev, data_sz, (u8 *) 941 page1_alloc, page1_dma); 942 } 943 944 return rc; 945 } 946 947 static void 948 mptfc_SetFcPortPage1_defaults(MPT_ADAPTER *ioc) 949 { 950 int ii; 951 FCPortPage1_t *pp1; 952 953 #define MPTFC_FW_DEVICE_TIMEOUT (1) 954 #define MPTFC_FW_IO_PEND_TIMEOUT (1) 955 #define ON_FLAGS (MPI_FCPORTPAGE1_FLAGS_IMMEDIATE_ERROR_REPLY) 956 #define OFF_FLAGS (MPI_FCPORTPAGE1_FLAGS_VERBOSE_RESCAN_EVENTS) 957 958 for (ii=0; ii<ioc->facts.NumberOfPorts; ii++) { 959 if (mptfc_GetFcPortPage1(ioc, ii) != 0) 960 continue; 961 pp1 = ioc->fc_data.fc_port_page1[ii].data; 962 if ((pp1->InitiatorDeviceTimeout == MPTFC_FW_DEVICE_TIMEOUT) 963 && (pp1->InitiatorIoPendTimeout == MPTFC_FW_IO_PEND_TIMEOUT) 964 && ((pp1->Flags & ON_FLAGS) == ON_FLAGS) 965 && ((pp1->Flags & OFF_FLAGS) == 0)) 966 continue; 967 pp1->InitiatorDeviceTimeout = MPTFC_FW_DEVICE_TIMEOUT; 968 pp1->InitiatorIoPendTimeout = MPTFC_FW_IO_PEND_TIMEOUT; 969 pp1->Flags &= ~OFF_FLAGS; 970 pp1->Flags |= ON_FLAGS; 971 mptfc_WriteFcPortPage1(ioc, ii); 972 } 973 } 974 975 976 static void 977 mptfc_init_host_attr(MPT_ADAPTER *ioc,int portnum) 978 { 979 unsigned class = 0; 980 unsigned cos = 0; 981 unsigned speed; 982 unsigned port_type; 983 unsigned port_state; 984 FCPortPage0_t *pp0; 985 struct Scsi_Host *sh; 986 char *sn; 987 988 /* don't know what to do as only one scsi (fc) host was allocated */ 989 if (portnum != 0) 990 return; 991 992 pp0 = &ioc->fc_port_page0[portnum]; 993 sh = ioc->sh; 994 995 sn = fc_host_symbolic_name(sh); 996 snprintf(sn, FC_SYMBOLIC_NAME_SIZE, "%s %s%08xh", 997 ioc->prod_name, 998 MPT_FW_REV_MAGIC_ID_STRING, 999 ioc->facts.FWVersion.Word); 1000 1001 fc_host_tgtid_bind_type(sh) = FC_TGTID_BIND_BY_WWPN; 1002 1003 fc_host_maxframe_size(sh) = pp0->MaxFrameSize; 1004 1005 fc_host_node_name(sh) = 1006 (u64)pp0->WWNN.High << 32 | (u64)pp0->WWNN.Low; 1007 1008 fc_host_port_name(sh) = 1009 (u64)pp0->WWPN.High << 32 | (u64)pp0->WWPN.Low; 1010 1011 fc_host_port_id(sh) = pp0->PortIdentifier; 1012 1013 class = pp0->SupportedServiceClass; 1014 if (class & MPI_FCPORTPAGE0_SUPPORT_CLASS_1) 1015 cos |= FC_COS_CLASS1; 1016 if (class & MPI_FCPORTPAGE0_SUPPORT_CLASS_2) 1017 cos |= FC_COS_CLASS2; 1018 if (class & MPI_FCPORTPAGE0_SUPPORT_CLASS_3) 1019 cos |= FC_COS_CLASS3; 1020 fc_host_supported_classes(sh) = cos; 1021 1022 if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_1GBIT) 1023 speed = FC_PORTSPEED_1GBIT; 1024 else if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_2GBIT) 1025 speed = FC_PORTSPEED_2GBIT; 1026 else if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_4GBIT) 1027 speed = FC_PORTSPEED_4GBIT; 1028 else if (pp0->CurrentSpeed == MPI_FCPORTPAGE0_CURRENT_SPEED_10GBIT) 1029 speed = FC_PORTSPEED_10GBIT; 1030 else 1031 speed = FC_PORTSPEED_UNKNOWN; 1032 fc_host_speed(sh) = speed; 1033 1034 speed = 0; 1035 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_1GBIT_SPEED) 1036 speed |= FC_PORTSPEED_1GBIT; 1037 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_2GBIT_SPEED) 1038 speed |= FC_PORTSPEED_2GBIT; 1039 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_4GBIT_SPEED) 1040 speed |= FC_PORTSPEED_4GBIT; 1041 if (pp0->SupportedSpeeds & MPI_FCPORTPAGE0_SUPPORT_10GBIT_SPEED) 1042 speed |= FC_PORTSPEED_10GBIT; 1043 fc_host_supported_speeds(sh) = speed; 1044 1045 port_state = FC_PORTSTATE_UNKNOWN; 1046 if (pp0->PortState == MPI_FCPORTPAGE0_PORTSTATE_ONLINE) 1047 port_state = FC_PORTSTATE_ONLINE; 1048 else if (pp0->PortState == MPI_FCPORTPAGE0_PORTSTATE_OFFLINE) 1049 port_state = FC_PORTSTATE_LINKDOWN; 1050 fc_host_port_state(sh) = port_state; 1051 1052 port_type = FC_PORTTYPE_UNKNOWN; 1053 if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_POINT_TO_POINT) 1054 port_type = FC_PORTTYPE_PTP; 1055 else if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_PRIVATE_LOOP) 1056 port_type = FC_PORTTYPE_LPORT; 1057 else if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_PUBLIC_LOOP) 1058 port_type = FC_PORTTYPE_NLPORT; 1059 else if (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_ATTACH_FABRIC_DIRECT) 1060 port_type = FC_PORTTYPE_NPORT; 1061 fc_host_port_type(sh) = port_type; 1062 1063 fc_host_fabric_name(sh) = 1064 (pp0->Flags & MPI_FCPORTPAGE0_FLAGS_FABRIC_WWN_VALID) ? 1065 (u64) pp0->FabricWWNN.High << 32 | (u64) pp0->FabricWWPN.Low : 1066 (u64)pp0->WWNN.High << 32 | (u64)pp0->WWNN.Low; 1067 1068 } 1069 1070 static void 1071 mptfc_link_status_change(struct work_struct *work) 1072 { 1073 MPT_ADAPTER *ioc = 1074 container_of(work, MPT_ADAPTER, fc_rescan_work); 1075 int ii; 1076 1077 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) 1078 (void) mptfc_GetFcPortPage0(ioc, ii); 1079 1080 } 1081 1082 static void 1083 mptfc_setup_reset(struct work_struct *work) 1084 { 1085 MPT_ADAPTER *ioc = 1086 container_of(work, MPT_ADAPTER, fc_setup_reset_work); 1087 u64 pn; 1088 struct mptfc_rport_info *ri; 1089 1090 /* reset about to happen, delete (block) all rports */ 1091 list_for_each_entry(ri, &ioc->fc_rports, list) { 1092 if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { 1093 ri->flags &= ~MPT_RPORT_INFO_FLAGS_REGISTERED; 1094 fc_remote_port_delete(ri->rport); /* won't sleep */ 1095 ri->rport = NULL; 1096 1097 pn = (u64)ri->pg0.WWPN.High << 32 | 1098 (u64)ri->pg0.WWPN.Low; 1099 dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT 1100 "mptfc_setup_reset.%d: %llx deleted\n", 1101 ioc->name, 1102 ioc->sh->host_no, 1103 (unsigned long long)pn)); 1104 } 1105 } 1106 } 1107 1108 static void 1109 mptfc_rescan_devices(struct work_struct *work) 1110 { 1111 MPT_ADAPTER *ioc = 1112 container_of(work, MPT_ADAPTER, fc_rescan_work); 1113 int ii; 1114 u64 pn; 1115 struct mptfc_rport_info *ri; 1116 1117 /* start by tagging all ports as missing */ 1118 list_for_each_entry(ri, &ioc->fc_rports, list) { 1119 if (ri->flags & MPT_RPORT_INFO_FLAGS_REGISTERED) { 1120 ri->flags |= MPT_RPORT_INFO_FLAGS_MISSING; 1121 } 1122 } 1123 1124 /* 1125 * now rescan devices known to adapter, 1126 * will reregister existing rports 1127 */ 1128 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { 1129 (void) mptfc_GetFcPortPage0(ioc, ii); 1130 mptfc_init_host_attr(ioc, ii); /* refresh */ 1131 mptfc_GetFcDevPage0(ioc, ii, mptfc_register_dev); 1132 } 1133 1134 /* delete devices still missing */ 1135 list_for_each_entry(ri, &ioc->fc_rports, list) { 1136 /* if newly missing, delete it */ 1137 if (ri->flags & MPT_RPORT_INFO_FLAGS_MISSING) { 1138 1139 ri->flags &= ~(MPT_RPORT_INFO_FLAGS_REGISTERED| 1140 MPT_RPORT_INFO_FLAGS_MISSING); 1141 fc_remote_port_delete(ri->rport); /* won't sleep */ 1142 ri->rport = NULL; 1143 1144 pn = (u64)ri->pg0.WWPN.High << 32 | 1145 (u64)ri->pg0.WWPN.Low; 1146 dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT 1147 "mptfc_rescan.%d: %llx deleted\n", 1148 ioc->name, 1149 ioc->sh->host_no, 1150 (unsigned long long)pn)); 1151 } 1152 } 1153 } 1154 1155 static int 1156 mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) 1157 { 1158 struct Scsi_Host *sh; 1159 MPT_SCSI_HOST *hd; 1160 MPT_ADAPTER *ioc; 1161 unsigned long flags; 1162 int ii; 1163 int numSGE = 0; 1164 int scale; 1165 int ioc_cap; 1166 int error=0; 1167 int r; 1168 1169 if ((r = mpt_attach(pdev,id)) != 0) 1170 return r; 1171 1172 ioc = pci_get_drvdata(pdev); 1173 ioc->DoneCtx = mptfcDoneCtx; 1174 ioc->TaskCtx = mptfcTaskCtx; 1175 ioc->InternalCtx = mptfcInternalCtx; 1176 1177 /* Added sanity check on readiness of the MPT adapter. 1178 */ 1179 if (ioc->last_state != MPI_IOC_STATE_OPERATIONAL) { 1180 printk(MYIOC_s_WARN_FMT 1181 "Skipping because it's not operational!\n", 1182 ioc->name); 1183 error = -ENODEV; 1184 goto out_mptfc_probe; 1185 } 1186 1187 if (!ioc->active) { 1188 printk(MYIOC_s_WARN_FMT "Skipping because it's disabled!\n", 1189 ioc->name); 1190 error = -ENODEV; 1191 goto out_mptfc_probe; 1192 } 1193 1194 /* Sanity check - ensure at least 1 port is INITIATOR capable 1195 */ 1196 ioc_cap = 0; 1197 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { 1198 if (ioc->pfacts[ii].ProtocolFlags & 1199 MPI_PORTFACTS_PROTOCOL_INITIATOR) 1200 ioc_cap ++; 1201 } 1202 1203 if (!ioc_cap) { 1204 printk(MYIOC_s_WARN_FMT 1205 "Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n", 1206 ioc->name, ioc); 1207 return 0; 1208 } 1209 1210 sh = scsi_host_alloc(&mptfc_driver_template, sizeof(MPT_SCSI_HOST)); 1211 1212 if (!sh) { 1213 printk(MYIOC_s_WARN_FMT 1214 "Unable to register controller with SCSI subsystem\n", 1215 ioc->name); 1216 error = -1; 1217 goto out_mptfc_probe; 1218 } 1219 1220 spin_lock_init(&ioc->fc_rescan_work_lock); 1221 INIT_WORK(&ioc->fc_rescan_work, mptfc_rescan_devices); 1222 INIT_WORK(&ioc->fc_setup_reset_work, mptfc_setup_reset); 1223 INIT_WORK(&ioc->fc_lsc_work, mptfc_link_status_change); 1224 1225 spin_lock_irqsave(&ioc->FreeQlock, flags); 1226 1227 /* Attach the SCSI Host to the IOC structure 1228 */ 1229 ioc->sh = sh; 1230 1231 sh->io_port = 0; 1232 sh->n_io_port = 0; 1233 sh->irq = 0; 1234 1235 /* set 16 byte cdb's */ 1236 sh->max_cmd_len = 16; 1237 1238 sh->max_id = ioc->pfacts->MaxDevices; 1239 sh->max_lun = max_lun; 1240 1241 sh->this_id = ioc->pfacts[0].PortSCSIID; 1242 1243 /* Required entry. 1244 */ 1245 sh->unique_id = ioc->id; 1246 1247 /* Verify that we won't exceed the maximum 1248 * number of chain buffers 1249 * We can optimize: ZZ = req_sz/sizeof(SGE) 1250 * For 32bit SGE's: 1251 * numSGE = 1 + (ZZ-1)*(maxChain -1) + ZZ 1252 * + (req_sz - 64)/sizeof(SGE) 1253 * A slightly different algorithm is required for 1254 * 64bit SGEs. 1255 */ 1256 scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32)); 1257 if (sizeof(dma_addr_t) == sizeof(u64)) { 1258 numSGE = (scale - 1) * 1259 (ioc->facts.MaxChainDepth-1) + scale + 1260 (ioc->req_sz - 60) / (sizeof(dma_addr_t) + 1261 sizeof(u32)); 1262 } else { 1263 numSGE = 1 + (scale - 1) * 1264 (ioc->facts.MaxChainDepth-1) + scale + 1265 (ioc->req_sz - 64) / (sizeof(dma_addr_t) + 1266 sizeof(u32)); 1267 } 1268 1269 if (numSGE < sh->sg_tablesize) { 1270 /* Reset this value */ 1271 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT 1272 "Resetting sg_tablesize to %d from %d\n", 1273 ioc->name, numSGE, sh->sg_tablesize)); 1274 sh->sg_tablesize = numSGE; 1275 } 1276 1277 spin_unlock_irqrestore(&ioc->FreeQlock, flags); 1278 1279 hd = (MPT_SCSI_HOST *) sh->hostdata; 1280 hd->ioc = ioc; 1281 1282 /* SCSI needs scsi_cmnd lookup table! 1283 * (with size equal to req_depth*PtrSz!) 1284 */ 1285 hd->ScsiLookup = kcalloc(ioc->req_depth, sizeof(void *), GFP_ATOMIC); 1286 if (!hd->ScsiLookup) { 1287 error = -ENOMEM; 1288 goto out_mptfc_probe; 1289 } 1290 1291 dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", 1292 ioc->name, hd->ScsiLookup)); 1293 1294 /* Clear the TM flags 1295 */ 1296 hd->tmPending = 0; 1297 hd->tmState = TM_STATE_NONE; 1298 hd->resetPending = 0; 1299 hd->abortSCpnt = NULL; 1300 1301 /* Clear the pointer used to store 1302 * single-threaded commands, i.e., those 1303 * issued during a bus scan, dv and 1304 * configuration pages. 1305 */ 1306 hd->cmdPtr = NULL; 1307 1308 /* Initialize this SCSI Hosts' timers 1309 * To use, set the timer expires field 1310 * and add_timer 1311 */ 1312 init_timer(&hd->timer); 1313 hd->timer.data = (unsigned long) hd; 1314 hd->timer.function = mptscsih_timer_expired; 1315 1316 init_waitqueue_head(&hd->scandv_waitq); 1317 hd->scandv_wait_done = 0; 1318 hd->last_queue_full = 0; 1319 1320 sh->transportt = mptfc_transport_template; 1321 error = scsi_add_host (sh, &ioc->pcidev->dev); 1322 if(error) { 1323 dprintk(ioc, printk(KERN_ERR MYNAM 1324 "scsi_add_host failed\n")); 1325 goto out_mptfc_probe; 1326 } 1327 1328 /* initialize workqueue */ 1329 1330 snprintf(ioc->fc_rescan_work_q_name, KOBJ_NAME_LEN, "mptfc_wq_%d", 1331 sh->host_no); 1332 ioc->fc_rescan_work_q = 1333 create_singlethread_workqueue(ioc->fc_rescan_work_q_name); 1334 if (!ioc->fc_rescan_work_q) 1335 goto out_mptfc_probe; 1336 1337 /* 1338 * Pre-fetch FC port WWN and stuff... 1339 * (FCPortPage0_t stuff) 1340 */ 1341 for (ii=0; ii < ioc->facts.NumberOfPorts; ii++) { 1342 (void) mptfc_GetFcPortPage0(ioc, ii); 1343 } 1344 mptfc_SetFcPortPage1_defaults(ioc); 1345 1346 /* 1347 * scan for rports - 1348 * by doing it via the workqueue, some locking is eliminated 1349 */ 1350 1351 queue_work(ioc->fc_rescan_work_q, &ioc->fc_rescan_work); 1352 flush_workqueue(ioc->fc_rescan_work_q); 1353 1354 return 0; 1355 1356 out_mptfc_probe: 1357 1358 mptscsih_remove(pdev); 1359 return error; 1360 } 1361 1362 static struct pci_driver mptfc_driver = { 1363 .name = "mptfc", 1364 .id_table = mptfc_pci_table, 1365 .probe = mptfc_probe, 1366 .remove = __devexit_p(mptfc_remove), 1367 .shutdown = mptscsih_shutdown, 1368 #ifdef CONFIG_PM 1369 .suspend = mptscsih_suspend, 1370 .resume = mptscsih_resume, 1371 #endif 1372 }; 1373 1374 static int 1375 mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) 1376 { 1377 MPT_SCSI_HOST *hd; 1378 u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; 1379 unsigned long flags; 1380 int rc=1; 1381 1382 devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n", 1383 ioc->name, event)); 1384 1385 if (ioc->sh == NULL || 1386 ((hd = (MPT_SCSI_HOST *)ioc->sh->hostdata) == NULL)) 1387 return 1; 1388 1389 switch (event) { 1390 case MPI_EVENT_RESCAN: 1391 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); 1392 if (ioc->fc_rescan_work_q) { 1393 queue_work(ioc->fc_rescan_work_q, 1394 &ioc->fc_rescan_work); 1395 } 1396 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); 1397 break; 1398 case MPI_EVENT_LINK_STATUS_CHANGE: 1399 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); 1400 if (ioc->fc_rescan_work_q) { 1401 queue_work(ioc->fc_rescan_work_q, 1402 &ioc->fc_lsc_work); 1403 } 1404 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); 1405 break; 1406 default: 1407 rc = mptscsih_event_process(ioc,pEvReply); 1408 break; 1409 } 1410 return rc; 1411 } 1412 1413 static int 1414 mptfc_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) 1415 { 1416 int rc; 1417 unsigned long flags; 1418 1419 rc = mptscsih_ioc_reset(ioc,reset_phase); 1420 if (rc == 0) 1421 return rc; 1422 1423 1424 dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT 1425 ": IOC %s_reset routed to FC host driver!\n",ioc->name, 1426 reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( 1427 reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); 1428 1429 if (reset_phase == MPT_IOC_SETUP_RESET) { 1430 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); 1431 if (ioc->fc_rescan_work_q) { 1432 queue_work(ioc->fc_rescan_work_q, 1433 &ioc->fc_setup_reset_work); 1434 } 1435 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); 1436 } 1437 1438 else if (reset_phase == MPT_IOC_PRE_RESET) { 1439 } 1440 1441 else { /* MPT_IOC_POST_RESET */ 1442 mptfc_SetFcPortPage1_defaults(ioc); 1443 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); 1444 if (ioc->fc_rescan_work_q) { 1445 queue_work(ioc->fc_rescan_work_q, 1446 &ioc->fc_rescan_work); 1447 } 1448 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); 1449 } 1450 return 1; 1451 } 1452 1453 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 1454 /** 1455 * mptfc_init - Register MPT adapter(s) as SCSI host(s) with SCSI mid-layer. 1456 * 1457 * Returns 0 for success, non-zero for failure. 1458 */ 1459 static int __init 1460 mptfc_init(void) 1461 { 1462 int error; 1463 1464 show_mptmod_ver(my_NAME, my_VERSION); 1465 1466 /* sanity check module parameters */ 1467 if (mptfc_dev_loss_tmo <= 0) 1468 mptfc_dev_loss_tmo = MPTFC_DEV_LOSS_TMO; 1469 1470 mptfc_transport_template = 1471 fc_attach_transport(&mptfc_transport_functions); 1472 1473 if (!mptfc_transport_template) 1474 return -ENODEV; 1475 1476 mptfcDoneCtx = mpt_register(mptscsih_io_done, MPTFC_DRIVER); 1477 mptfcTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTFC_DRIVER); 1478 mptfcInternalCtx = mpt_register(mptscsih_scandv_complete, MPTFC_DRIVER); 1479 1480 mpt_event_register(mptfcDoneCtx, mptfc_event_process); 1481 mpt_reset_register(mptfcDoneCtx, mptfc_ioc_reset); 1482 1483 error = pci_register_driver(&mptfc_driver); 1484 if (error) 1485 fc_release_transport(mptfc_transport_template); 1486 1487 return error; 1488 } 1489 1490 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 1491 /** 1492 * mptfc_remove - Remove fc infrastructure for devices 1493 * @pdev: Pointer to pci_dev structure 1494 * 1495 */ 1496 static void __devexit 1497 mptfc_remove(struct pci_dev *pdev) 1498 { 1499 MPT_ADAPTER *ioc = pci_get_drvdata(pdev); 1500 struct mptfc_rport_info *p, *n; 1501 struct workqueue_struct *work_q; 1502 unsigned long flags; 1503 int ii; 1504 1505 /* destroy workqueue */ 1506 if ((work_q=ioc->fc_rescan_work_q)) { 1507 spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags); 1508 ioc->fc_rescan_work_q = NULL; 1509 spin_unlock_irqrestore(&ioc->fc_rescan_work_lock, flags); 1510 destroy_workqueue(work_q); 1511 } 1512 1513 fc_remove_host(ioc->sh); 1514 1515 list_for_each_entry_safe(p, n, &ioc->fc_rports, list) { 1516 list_del(&p->list); 1517 kfree(p); 1518 } 1519 1520 for (ii=0; ii<ioc->facts.NumberOfPorts; ii++) { 1521 if (ioc->fc_data.fc_port_page1[ii].data) { 1522 pci_free_consistent(ioc->pcidev, 1523 ioc->fc_data.fc_port_page1[ii].pg_sz, 1524 (u8 *) ioc->fc_data.fc_port_page1[ii].data, 1525 ioc->fc_data.fc_port_page1[ii].dma); 1526 ioc->fc_data.fc_port_page1[ii].data = NULL; 1527 } 1528 } 1529 1530 mptscsih_remove(pdev); 1531 } 1532 1533 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 1534 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 1535 /** 1536 * mptfc_exit - Unregisters MPT adapter(s) 1537 * 1538 */ 1539 static void __exit 1540 mptfc_exit(void) 1541 { 1542 pci_unregister_driver(&mptfc_driver); 1543 fc_release_transport(mptfc_transport_template); 1544 1545 mpt_reset_deregister(mptfcDoneCtx); 1546 mpt_event_deregister(mptfcDoneCtx); 1547 1548 mpt_deregister(mptfcInternalCtx); 1549 mpt_deregister(mptfcTaskCtx); 1550 mpt_deregister(mptfcDoneCtx); 1551 } 1552 1553 module_init(mptfc_init); 1554 module_exit(mptfc_exit); 1555