1623 lines · c
1/*2 * Linux driver for VMware's para-virtualized SCSI HBA.3 *4 * Copyright (C) 2008-2014, VMware, Inc. All Rights Reserved.5 *6 * This program is free software; you can redistribute it and/or modify it7 * under the terms of the GNU General Public License as published by the8 * Free Software Foundation; version 2 of the License and no later version.9 *10 * This program is distributed in the hope that it will be useful, but11 * WITHOUT ANY WARRANTY; without even the implied warranty of12 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or13 * NON INFRINGEMENT. See the GNU General Public License for more14 * details.15 *16 * You should have received a copy of the GNU General Public License17 * along with this program; if not, write to the Free Software18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19 *20 */21 22#include <linux/kernel.h>23#include <linux/module.h>24#include <linux/interrupt.h>25#include <linux/slab.h>26#include <linux/workqueue.h>27#include <linux/pci.h>28 29#include <scsi/scsi.h>30#include <scsi/scsi_host.h>31#include <scsi/scsi_cmnd.h>32#include <scsi/scsi_device.h>33#include <scsi/scsi_tcq.h>34 35#include "vmw_pvscsi.h"36 37#define PVSCSI_LINUX_DRIVER_DESC "VMware PVSCSI driver"38 39MODULE_DESCRIPTION(PVSCSI_LINUX_DRIVER_DESC);40MODULE_AUTHOR("VMware, Inc.");41MODULE_LICENSE("GPL");42MODULE_VERSION(PVSCSI_DRIVER_VERSION_STRING);43 44#define PVSCSI_DEFAULT_NUM_PAGES_PER_RING 845#define PVSCSI_DEFAULT_NUM_PAGES_MSG_RING 146#define PVSCSI_DEFAULT_QUEUE_DEPTH 25447#define SGL_SIZE PAGE_SIZE48 49struct pvscsi_sg_list {50 struct PVSCSISGElement sge[PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT];51};52 53struct pvscsi_ctx {54 /*55 * The index of the context in cmd_map serves as the context ID for a56 * 1-to-1 mapping completions back to requests.57 */58 struct scsi_cmnd *cmd;59 struct pvscsi_sg_list *sgl;60 struct list_head list;61 dma_addr_t dataPA;62 dma_addr_t sensePA;63 dma_addr_t sglPA;64 struct completion *abort_cmp;65};66 67struct pvscsi_adapter {68 char *mmioBase;69 u8 rev;70 bool use_msg;71 bool use_req_threshold;72 73 spinlock_t hw_lock;74 75 struct workqueue_struct *workqueue;76 struct work_struct work;77 78 struct PVSCSIRingReqDesc *req_ring;79 unsigned req_pages;80 unsigned req_depth;81 dma_addr_t reqRingPA;82 83 struct PVSCSIRingCmpDesc *cmp_ring;84 unsigned cmp_pages;85 dma_addr_t cmpRingPA;86 87 struct PVSCSIRingMsgDesc *msg_ring;88 unsigned msg_pages;89 dma_addr_t msgRingPA;90 91 struct PVSCSIRingsState *rings_state;92 dma_addr_t ringStatePA;93 94 struct pci_dev *dev;95 struct Scsi_Host *host;96 97 struct list_head cmd_pool;98 struct pvscsi_ctx *cmd_map;99};100 101 102/* Command line parameters */103static int pvscsi_ring_pages;104static int pvscsi_msg_ring_pages = PVSCSI_DEFAULT_NUM_PAGES_MSG_RING;105static int pvscsi_cmd_per_lun = PVSCSI_DEFAULT_QUEUE_DEPTH;106static bool pvscsi_disable_msi;107static bool pvscsi_disable_msix;108static bool pvscsi_use_msg = true;109static bool pvscsi_use_req_threshold = true;110 111#define PVSCSI_RW (S_IRUSR | S_IWUSR)112 113module_param_named(ring_pages, pvscsi_ring_pages, int, PVSCSI_RW);114MODULE_PARM_DESC(ring_pages, "Number of pages per req/cmp ring - (default="115 __stringify(PVSCSI_DEFAULT_NUM_PAGES_PER_RING)116 "[up to 16 targets],"117 __stringify(PVSCSI_SETUP_RINGS_MAX_NUM_PAGES)118 "[for 16+ targets])");119 120module_param_named(msg_ring_pages, pvscsi_msg_ring_pages, int, PVSCSI_RW);121MODULE_PARM_DESC(msg_ring_pages, "Number of pages for the msg ring - (default="122 __stringify(PVSCSI_DEFAULT_NUM_PAGES_MSG_RING) ")");123 124module_param_named(cmd_per_lun, pvscsi_cmd_per_lun, int, PVSCSI_RW);125MODULE_PARM_DESC(cmd_per_lun, "Maximum commands per lun - (default="126 __stringify(PVSCSI_DEFAULT_QUEUE_DEPTH) ")");127 128module_param_named(disable_msi, pvscsi_disable_msi, bool, PVSCSI_RW);129MODULE_PARM_DESC(disable_msi, "Disable MSI use in driver - (default=0)");130 131module_param_named(disable_msix, pvscsi_disable_msix, bool, PVSCSI_RW);132MODULE_PARM_DESC(disable_msix, "Disable MSI-X use in driver - (default=0)");133 134module_param_named(use_msg, pvscsi_use_msg, bool, PVSCSI_RW);135MODULE_PARM_DESC(use_msg, "Use msg ring when available - (default=1)");136 137module_param_named(use_req_threshold, pvscsi_use_req_threshold,138 bool, PVSCSI_RW);139MODULE_PARM_DESC(use_req_threshold, "Use driver-based request coalescing if configured - (default=1)");140 141static const struct pci_device_id pvscsi_pci_tbl[] = {142 { PCI_VDEVICE(VMWARE, PCI_DEVICE_ID_VMWARE_PVSCSI) },143 { 0 }144};145 146MODULE_DEVICE_TABLE(pci, pvscsi_pci_tbl);147 148static struct device *149pvscsi_dev(const struct pvscsi_adapter *adapter)150{151 return &(adapter->dev->dev);152}153 154static struct pvscsi_ctx *155pvscsi_find_context(const struct pvscsi_adapter *adapter, struct scsi_cmnd *cmd)156{157 struct pvscsi_ctx *ctx, *end;158 159 end = &adapter->cmd_map[adapter->req_depth];160 for (ctx = adapter->cmd_map; ctx < end; ctx++)161 if (ctx->cmd == cmd)162 return ctx;163 164 return NULL;165}166 167static struct pvscsi_ctx *168pvscsi_acquire_context(struct pvscsi_adapter *adapter, struct scsi_cmnd *cmd)169{170 struct pvscsi_ctx *ctx;171 172 if (list_empty(&adapter->cmd_pool))173 return NULL;174 175 ctx = list_first_entry(&adapter->cmd_pool, struct pvscsi_ctx, list);176 ctx->cmd = cmd;177 list_del(&ctx->list);178 179 return ctx;180}181 182static void pvscsi_release_context(struct pvscsi_adapter *adapter,183 struct pvscsi_ctx *ctx)184{185 ctx->cmd = NULL;186 ctx->abort_cmp = NULL;187 list_add(&ctx->list, &adapter->cmd_pool);188}189 190/*191 * Map a pvscsi_ctx struct to a context ID field value; we map to a simple192 * non-zero integer. ctx always points to an entry in cmd_map array, hence193 * the return value is always >=1.194 */195static u64 pvscsi_map_context(const struct pvscsi_adapter *adapter,196 const struct pvscsi_ctx *ctx)197{198 return ctx - adapter->cmd_map + 1;199}200 201static struct pvscsi_ctx *202pvscsi_get_context(const struct pvscsi_adapter *adapter, u64 context)203{204 return &adapter->cmd_map[context - 1];205}206 207static void pvscsi_reg_write(const struct pvscsi_adapter *adapter,208 u32 offset, u32 val)209{210 writel(val, adapter->mmioBase + offset);211}212 213static u32 pvscsi_reg_read(const struct pvscsi_adapter *adapter, u32 offset)214{215 return readl(adapter->mmioBase + offset);216}217 218static u32 pvscsi_read_intr_status(const struct pvscsi_adapter *adapter)219{220 return pvscsi_reg_read(adapter, PVSCSI_REG_OFFSET_INTR_STATUS);221}222 223static void pvscsi_write_intr_status(const struct pvscsi_adapter *adapter,224 u32 val)225{226 pvscsi_reg_write(adapter, PVSCSI_REG_OFFSET_INTR_STATUS, val);227}228 229static void pvscsi_unmask_intr(const struct pvscsi_adapter *adapter)230{231 u32 intr_bits;232 233 intr_bits = PVSCSI_INTR_CMPL_MASK;234 if (adapter->use_msg)235 intr_bits |= PVSCSI_INTR_MSG_MASK;236 237 pvscsi_reg_write(adapter, PVSCSI_REG_OFFSET_INTR_MASK, intr_bits);238}239 240static void pvscsi_mask_intr(const struct pvscsi_adapter *adapter)241{242 pvscsi_reg_write(adapter, PVSCSI_REG_OFFSET_INTR_MASK, 0);243}244 245static void pvscsi_write_cmd_desc(const struct pvscsi_adapter *adapter,246 u32 cmd, const void *desc, size_t len)247{248 const u32 *ptr = desc;249 size_t i;250 251 len /= sizeof(*ptr);252 pvscsi_reg_write(adapter, PVSCSI_REG_OFFSET_COMMAND, cmd);253 for (i = 0; i < len; i++)254 pvscsi_reg_write(adapter,255 PVSCSI_REG_OFFSET_COMMAND_DATA, ptr[i]);256}257 258static void pvscsi_abort_cmd(const struct pvscsi_adapter *adapter,259 const struct pvscsi_ctx *ctx)260{261 struct PVSCSICmdDescAbortCmd cmd = { 0 };262 263 cmd.target = ctx->cmd->device->id;264 cmd.context = pvscsi_map_context(adapter, ctx);265 266 pvscsi_write_cmd_desc(adapter, PVSCSI_CMD_ABORT_CMD, &cmd, sizeof(cmd));267}268 269static void pvscsi_kick_rw_io(const struct pvscsi_adapter *adapter)270{271 pvscsi_reg_write(adapter, PVSCSI_REG_OFFSET_KICK_RW_IO, 0);272}273 274static void pvscsi_process_request_ring(const struct pvscsi_adapter *adapter)275{276 pvscsi_reg_write(adapter, PVSCSI_REG_OFFSET_KICK_NON_RW_IO, 0);277}278 279static int scsi_is_rw(unsigned char op)280{281 return op == READ_6 || op == WRITE_6 ||282 op == READ_10 || op == WRITE_10 ||283 op == READ_12 || op == WRITE_12 ||284 op == READ_16 || op == WRITE_16;285}286 287static void pvscsi_kick_io(const struct pvscsi_adapter *adapter,288 unsigned char op)289{290 if (scsi_is_rw(op)) {291 struct PVSCSIRingsState *s = adapter->rings_state;292 293 if (!adapter->use_req_threshold ||294 s->reqProdIdx - s->reqConsIdx >= s->reqCallThreshold)295 pvscsi_kick_rw_io(adapter);296 } else {297 pvscsi_process_request_ring(adapter);298 }299}300 301static void ll_adapter_reset(const struct pvscsi_adapter *adapter)302{303 dev_dbg(pvscsi_dev(adapter), "Adapter Reset on %p\n", adapter);304 305 pvscsi_write_cmd_desc(adapter, PVSCSI_CMD_ADAPTER_RESET, NULL, 0);306}307 308static void ll_bus_reset(const struct pvscsi_adapter *adapter)309{310 dev_dbg(pvscsi_dev(adapter), "Resetting bus on %p\n", adapter);311 312 pvscsi_write_cmd_desc(adapter, PVSCSI_CMD_RESET_BUS, NULL, 0);313}314 315static void ll_device_reset(const struct pvscsi_adapter *adapter, u32 target)316{317 struct PVSCSICmdDescResetDevice cmd = { 0 };318 319 dev_dbg(pvscsi_dev(adapter), "Resetting device: target=%u\n", target);320 321 cmd.target = target;322 323 pvscsi_write_cmd_desc(adapter, PVSCSI_CMD_RESET_DEVICE,324 &cmd, sizeof(cmd));325}326 327static void pvscsi_create_sg(struct pvscsi_ctx *ctx,328 struct scatterlist *sg, unsigned count)329{330 unsigned i;331 struct PVSCSISGElement *sge;332 333 BUG_ON(count > PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT);334 335 sge = &ctx->sgl->sge[0];336 for (i = 0; i < count; i++, sg = sg_next(sg)) {337 sge[i].addr = sg_dma_address(sg);338 sge[i].length = sg_dma_len(sg);339 sge[i].flags = 0;340 }341}342 343/*344 * Map all data buffers for a command into PCI space and345 * setup the scatter/gather list if needed.346 */347static int pvscsi_map_buffers(struct pvscsi_adapter *adapter,348 struct pvscsi_ctx *ctx, struct scsi_cmnd *cmd,349 struct PVSCSIRingReqDesc *e)350{351 unsigned count;352 unsigned bufflen = scsi_bufflen(cmd);353 struct scatterlist *sg;354 355 e->dataLen = bufflen;356 e->dataAddr = 0;357 if (bufflen == 0)358 return 0;359 360 sg = scsi_sglist(cmd);361 count = scsi_sg_count(cmd);362 if (count != 0) {363 int segs = scsi_dma_map(cmd);364 365 if (segs == -ENOMEM) {366 scmd_printk(KERN_DEBUG, cmd,367 "vmw_pvscsi: Failed to map cmd sglist for DMA.\n");368 return -ENOMEM;369 } else if (segs > 1) {370 pvscsi_create_sg(ctx, sg, segs);371 372 e->flags |= PVSCSI_FLAG_CMD_WITH_SG_LIST;373 ctx->sglPA = dma_map_single(&adapter->dev->dev,374 ctx->sgl, SGL_SIZE, DMA_TO_DEVICE);375 if (dma_mapping_error(&adapter->dev->dev, ctx->sglPA)) {376 scmd_printk(KERN_ERR, cmd,377 "vmw_pvscsi: Failed to map ctx sglist for DMA.\n");378 scsi_dma_unmap(cmd);379 ctx->sglPA = 0;380 return -ENOMEM;381 }382 e->dataAddr = ctx->sglPA;383 } else384 e->dataAddr = sg_dma_address(sg);385 } else {386 /*387 * In case there is no S/G list, scsi_sglist points388 * directly to the buffer.389 */390 ctx->dataPA = dma_map_single(&adapter->dev->dev, sg, bufflen,391 cmd->sc_data_direction);392 if (dma_mapping_error(&adapter->dev->dev, ctx->dataPA)) {393 scmd_printk(KERN_DEBUG, cmd,394 "vmw_pvscsi: Failed to map direct data buffer for DMA.\n");395 return -ENOMEM;396 }397 e->dataAddr = ctx->dataPA;398 }399 400 return 0;401}402 403/*404 * The device incorrectly doesn't clear the first byte of the sense405 * buffer in some cases. We have to do it ourselves.406 * Otherwise we run into trouble when SWIOTLB is forced.407 */408static void pvscsi_patch_sense(struct scsi_cmnd *cmd)409{410 if (cmd->sense_buffer)411 cmd->sense_buffer[0] = 0;412}413 414static void pvscsi_unmap_buffers(const struct pvscsi_adapter *adapter,415 struct pvscsi_ctx *ctx)416{417 struct scsi_cmnd *cmd;418 unsigned bufflen;419 420 cmd = ctx->cmd;421 bufflen = scsi_bufflen(cmd);422 423 if (bufflen != 0) {424 unsigned count = scsi_sg_count(cmd);425 426 if (count != 0) {427 scsi_dma_unmap(cmd);428 if (ctx->sglPA) {429 dma_unmap_single(&adapter->dev->dev, ctx->sglPA,430 SGL_SIZE, DMA_TO_DEVICE);431 ctx->sglPA = 0;432 }433 } else434 dma_unmap_single(&adapter->dev->dev, ctx->dataPA,435 bufflen, cmd->sc_data_direction);436 }437 if (cmd->sense_buffer)438 dma_unmap_single(&adapter->dev->dev, ctx->sensePA,439 SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);440}441 442static int pvscsi_allocate_rings(struct pvscsi_adapter *adapter)443{444 adapter->rings_state = dma_alloc_coherent(&adapter->dev->dev, PAGE_SIZE,445 &adapter->ringStatePA, GFP_KERNEL);446 if (!adapter->rings_state)447 return -ENOMEM;448 449 adapter->req_pages = min(PVSCSI_MAX_NUM_PAGES_REQ_RING,450 pvscsi_ring_pages);451 adapter->req_depth = adapter->req_pages452 * PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE;453 adapter->req_ring = dma_alloc_coherent(&adapter->dev->dev,454 adapter->req_pages * PAGE_SIZE, &adapter->reqRingPA,455 GFP_KERNEL);456 if (!adapter->req_ring)457 return -ENOMEM;458 459 adapter->cmp_pages = min(PVSCSI_MAX_NUM_PAGES_CMP_RING,460 pvscsi_ring_pages);461 adapter->cmp_ring = dma_alloc_coherent(&adapter->dev->dev,462 adapter->cmp_pages * PAGE_SIZE, &adapter->cmpRingPA,463 GFP_KERNEL);464 if (!adapter->cmp_ring)465 return -ENOMEM;466 467 BUG_ON(!IS_ALIGNED(adapter->ringStatePA, PAGE_SIZE));468 BUG_ON(!IS_ALIGNED(adapter->reqRingPA, PAGE_SIZE));469 BUG_ON(!IS_ALIGNED(adapter->cmpRingPA, PAGE_SIZE));470 471 if (!adapter->use_msg)472 return 0;473 474 adapter->msg_pages = min(PVSCSI_MAX_NUM_PAGES_MSG_RING,475 pvscsi_msg_ring_pages);476 adapter->msg_ring = dma_alloc_coherent(&adapter->dev->dev,477 adapter->msg_pages * PAGE_SIZE, &adapter->msgRingPA,478 GFP_KERNEL);479 if (!adapter->msg_ring)480 return -ENOMEM;481 BUG_ON(!IS_ALIGNED(adapter->msgRingPA, PAGE_SIZE));482 483 return 0;484}485 486static void pvscsi_setup_all_rings(const struct pvscsi_adapter *adapter)487{488 struct PVSCSICmdDescSetupRings cmd = { 0 };489 dma_addr_t base;490 unsigned i;491 492 cmd.ringsStatePPN = adapter->ringStatePA >> PAGE_SHIFT;493 cmd.reqRingNumPages = adapter->req_pages;494 cmd.cmpRingNumPages = adapter->cmp_pages;495 496 base = adapter->reqRingPA;497 for (i = 0; i < adapter->req_pages; i++) {498 cmd.reqRingPPNs[i] = base >> PAGE_SHIFT;499 base += PAGE_SIZE;500 }501 502 base = adapter->cmpRingPA;503 for (i = 0; i < adapter->cmp_pages; i++) {504 cmd.cmpRingPPNs[i] = base >> PAGE_SHIFT;505 base += PAGE_SIZE;506 }507 508 memset(adapter->rings_state, 0, PAGE_SIZE);509 memset(adapter->req_ring, 0, adapter->req_pages * PAGE_SIZE);510 memset(adapter->cmp_ring, 0, adapter->cmp_pages * PAGE_SIZE);511 512 pvscsi_write_cmd_desc(adapter, PVSCSI_CMD_SETUP_RINGS,513 &cmd, sizeof(cmd));514 515 if (adapter->use_msg) {516 struct PVSCSICmdDescSetupMsgRing cmd_msg = { 0 };517 518 cmd_msg.numPages = adapter->msg_pages;519 520 base = adapter->msgRingPA;521 for (i = 0; i < adapter->msg_pages; i++) {522 cmd_msg.ringPPNs[i] = base >> PAGE_SHIFT;523 base += PAGE_SIZE;524 }525 memset(adapter->msg_ring, 0, adapter->msg_pages * PAGE_SIZE);526 527 pvscsi_write_cmd_desc(adapter, PVSCSI_CMD_SETUP_MSG_RING,528 &cmd_msg, sizeof(cmd_msg));529 }530}531 532static int pvscsi_change_queue_depth(struct scsi_device *sdev, int qdepth)533{534 if (!sdev->tagged_supported)535 qdepth = 1;536 return scsi_change_queue_depth(sdev, qdepth);537}538 539/*540 * Pull a completion descriptor off and pass the completion back541 * to the SCSI mid layer.542 */543static void pvscsi_complete_request(struct pvscsi_adapter *adapter,544 const struct PVSCSIRingCmpDesc *e)545{546 struct pvscsi_ctx *ctx;547 struct scsi_cmnd *cmd;548 struct completion *abort_cmp;549 u32 btstat = e->hostStatus;550 u32 sdstat = e->scsiStatus;551 552 ctx = pvscsi_get_context(adapter, e->context);553 cmd = ctx->cmd;554 abort_cmp = ctx->abort_cmp;555 pvscsi_unmap_buffers(adapter, ctx);556 if (sdstat != SAM_STAT_CHECK_CONDITION)557 pvscsi_patch_sense(cmd);558 pvscsi_release_context(adapter, ctx);559 if (abort_cmp) {560 /*561 * The command was requested to be aborted. Just signal that562 * the request completed and swallow the actual cmd completion563 * here. The abort handler will post a completion for this564 * command indicating that it got successfully aborted.565 */566 complete(abort_cmp);567 return;568 }569 570 cmd->result = 0;571 if (sdstat != SAM_STAT_GOOD &&572 (btstat == BTSTAT_SUCCESS ||573 btstat == BTSTAT_LINKED_COMMAND_COMPLETED ||574 btstat == BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG)) {575 if (sdstat == SAM_STAT_COMMAND_TERMINATED) {576 cmd->result = (DID_RESET << 16);577 } else {578 cmd->result = (DID_OK << 16) | sdstat;579 }580 } else581 switch (btstat) {582 case BTSTAT_SUCCESS:583 case BTSTAT_LINKED_COMMAND_COMPLETED:584 case BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG:585 /*586 * Commands like INQUIRY may transfer less data than587 * requested by the initiator via bufflen. Set residual588 * count to make upper layer aware of the actual amount589 * of data returned. There are cases when controller590 * returns zero dataLen with non zero data - do not set591 * residual count in that case.592 */593 if (e->dataLen && (e->dataLen < scsi_bufflen(cmd)))594 scsi_set_resid(cmd, scsi_bufflen(cmd) - e->dataLen);595 cmd->result = (DID_OK << 16);596 break;597 598 case BTSTAT_DATARUN:599 case BTSTAT_DATA_UNDERRUN:600 /* Report residual data in underruns */601 scsi_set_resid(cmd, scsi_bufflen(cmd) - e->dataLen);602 cmd->result = (DID_ERROR << 16);603 break;604 605 case BTSTAT_SELTIMEO:606 /* Our emulation returns this for non-connected devs */607 cmd->result = (DID_BAD_TARGET << 16);608 break;609 610 case BTSTAT_LUNMISMATCH:611 case BTSTAT_TAGREJECT:612 case BTSTAT_BADMSG:613 case BTSTAT_HAHARDWARE:614 case BTSTAT_INVPHASE:615 case BTSTAT_HATIMEOUT:616 case BTSTAT_NORESPONSE:617 case BTSTAT_DISCONNECT:618 case BTSTAT_HASOFTWARE:619 case BTSTAT_BUSFREE:620 case BTSTAT_SENSFAILED:621 cmd->result |= (DID_ERROR << 16);622 break;623 624 case BTSTAT_SENTRST:625 case BTSTAT_RECVRST:626 case BTSTAT_BUSRESET:627 cmd->result = (DID_RESET << 16);628 break;629 630 case BTSTAT_ABORTQUEUE:631 cmd->result = (DID_BUS_BUSY << 16);632 break;633 634 case BTSTAT_SCSIPARITY:635 cmd->result = (DID_PARITY << 16);636 break;637 638 default:639 cmd->result = (DID_ERROR << 16);640 scmd_printk(KERN_DEBUG, cmd,641 "Unknown completion status: 0x%x\n",642 btstat);643 }644 645 dev_dbg(&cmd->device->sdev_gendev,646 "cmd=%p %x ctx=%p result=0x%x status=0x%x,%x\n",647 cmd, cmd->cmnd[0], ctx, cmd->result, btstat, sdstat);648 649 scsi_done(cmd);650}651 652/*653 * barrier usage : Since the PVSCSI device is emulated, there could be cases654 * where we may want to serialize some accesses between the driver and the655 * emulation layer. We use compiler barriers instead of the more expensive656 * memory barriers because PVSCSI is only supported on X86 which has strong657 * memory access ordering.658 */659static void pvscsi_process_completion_ring(struct pvscsi_adapter *adapter)660{661 struct PVSCSIRingsState *s = adapter->rings_state;662 struct PVSCSIRingCmpDesc *ring = adapter->cmp_ring;663 u32 cmp_entries = s->cmpNumEntriesLog2;664 665 while (s->cmpConsIdx != s->cmpProdIdx) {666 struct PVSCSIRingCmpDesc *e = ring + (s->cmpConsIdx &667 MASK(cmp_entries));668 /*669 * This barrier() ensures that *e is not dereferenced while670 * the device emulation still writes data into the slot.671 * Since the device emulation advances s->cmpProdIdx only after672 * updating the slot we want to check it first.673 */674 barrier();675 pvscsi_complete_request(adapter, e);676 /*677 * This barrier() ensures that compiler doesn't reorder write678 * to s->cmpConsIdx before the read of (*e) inside679 * pvscsi_complete_request. Otherwise, device emulation may680 * overwrite *e before we had a chance to read it.681 */682 barrier();683 s->cmpConsIdx++;684 }685}686 687/*688 * Translate a Linux SCSI request into a request ring entry.689 */690static int pvscsi_queue_ring(struct pvscsi_adapter *adapter,691 struct pvscsi_ctx *ctx, struct scsi_cmnd *cmd)692{693 struct PVSCSIRingsState *s;694 struct PVSCSIRingReqDesc *e;695 struct scsi_device *sdev;696 u32 req_entries;697 698 s = adapter->rings_state;699 sdev = cmd->device;700 req_entries = s->reqNumEntriesLog2;701 702 /*703 * If this condition holds, we might have room on the request ring, but704 * we might not have room on the completion ring for the response.705 * However, we have already ruled out this possibility - we would not706 * have successfully allocated a context if it were true, since we only707 * have one context per request entry. Check for it anyway, since it708 * would be a serious bug.709 */710 if (s->reqProdIdx - s->cmpConsIdx >= 1 << req_entries) {711 scmd_printk(KERN_ERR, cmd, "vmw_pvscsi: "712 "ring full: reqProdIdx=%d cmpConsIdx=%d\n",713 s->reqProdIdx, s->cmpConsIdx);714 return -1;715 }716 717 e = adapter->req_ring + (s->reqProdIdx & MASK(req_entries));718 719 e->bus = sdev->channel;720 e->target = sdev->id;721 memset(e->lun, 0, sizeof(e->lun));722 e->lun[1] = sdev->lun;723 724 if (cmd->sense_buffer) {725 ctx->sensePA = dma_map_single(&adapter->dev->dev,726 cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE,727 DMA_FROM_DEVICE);728 if (dma_mapping_error(&adapter->dev->dev, ctx->sensePA)) {729 scmd_printk(KERN_DEBUG, cmd,730 "vmw_pvscsi: Failed to map sense buffer for DMA.\n");731 ctx->sensePA = 0;732 return -ENOMEM;733 }734 e->senseAddr = ctx->sensePA;735 e->senseLen = SCSI_SENSE_BUFFERSIZE;736 } else {737 e->senseLen = 0;738 e->senseAddr = 0;739 }740 e->cdbLen = cmd->cmd_len;741 e->vcpuHint = smp_processor_id();742 memcpy(e->cdb, cmd->cmnd, e->cdbLen);743 744 e->tag = SIMPLE_QUEUE_TAG;745 746 if (cmd->sc_data_direction == DMA_FROM_DEVICE)747 e->flags = PVSCSI_FLAG_CMD_DIR_TOHOST;748 else if (cmd->sc_data_direction == DMA_TO_DEVICE)749 e->flags = PVSCSI_FLAG_CMD_DIR_TODEVICE;750 else if (cmd->sc_data_direction == DMA_NONE)751 e->flags = PVSCSI_FLAG_CMD_DIR_NONE;752 else753 e->flags = 0;754 755 if (pvscsi_map_buffers(adapter, ctx, cmd, e) != 0) {756 if (cmd->sense_buffer) {757 dma_unmap_single(&adapter->dev->dev, ctx->sensePA,758 SCSI_SENSE_BUFFERSIZE,759 DMA_FROM_DEVICE);760 ctx->sensePA = 0;761 }762 return -ENOMEM;763 }764 765 e->context = pvscsi_map_context(adapter, ctx);766 767 barrier();768 769 s->reqProdIdx++;770 771 return 0;772}773 774static int pvscsi_queue_lck(struct scsi_cmnd *cmd)775{776 struct Scsi_Host *host = cmd->device->host;777 struct pvscsi_adapter *adapter = shost_priv(host);778 struct pvscsi_ctx *ctx;779 unsigned long flags;780 unsigned char op;781 782 spin_lock_irqsave(&adapter->hw_lock, flags);783 784 ctx = pvscsi_acquire_context(adapter, cmd);785 if (!ctx || pvscsi_queue_ring(adapter, ctx, cmd) != 0) {786 if (ctx)787 pvscsi_release_context(adapter, ctx);788 spin_unlock_irqrestore(&adapter->hw_lock, flags);789 return SCSI_MLQUEUE_HOST_BUSY;790 }791 792 op = cmd->cmnd[0];793 794 dev_dbg(&cmd->device->sdev_gendev,795 "queued cmd %p, ctx %p, op=%x\n", cmd, ctx, op);796 797 spin_unlock_irqrestore(&adapter->hw_lock, flags);798 799 pvscsi_kick_io(adapter, op);800 801 return 0;802}803 804static DEF_SCSI_QCMD(pvscsi_queue)805 806static int pvscsi_abort(struct scsi_cmnd *cmd)807{808 struct pvscsi_adapter *adapter = shost_priv(cmd->device->host);809 struct pvscsi_ctx *ctx;810 unsigned long flags;811 int result = SUCCESS;812 DECLARE_COMPLETION_ONSTACK(abort_cmp);813 int done;814 815 scmd_printk(KERN_DEBUG, cmd, "task abort on host %u, %p\n",816 adapter->host->host_no, cmd);817 818 spin_lock_irqsave(&adapter->hw_lock, flags);819 820 /*821 * Poll the completion ring first - we might be trying to abort822 * a command that is waiting to be dispatched in the completion ring.823 */824 pvscsi_process_completion_ring(adapter);825 826 /*827 * If there is no context for the command, it either already succeeded828 * or else was never properly issued. Not our problem.829 */830 ctx = pvscsi_find_context(adapter, cmd);831 if (!ctx) {832 scmd_printk(KERN_DEBUG, cmd, "Failed to abort cmd %p\n", cmd);833 goto out;834 }835 836 /*837 * Mark that the command has been requested to be aborted and issue838 * the abort.839 */840 ctx->abort_cmp = &abort_cmp;841 842 pvscsi_abort_cmd(adapter, ctx);843 spin_unlock_irqrestore(&adapter->hw_lock, flags);844 /* Wait for 2 secs for the completion. */845 done = wait_for_completion_timeout(&abort_cmp, msecs_to_jiffies(2000));846 spin_lock_irqsave(&adapter->hw_lock, flags);847 848 if (!done) {849 /*850 * Failed to abort the command, unmark the fact that it851 * was requested to be aborted.852 */853 ctx->abort_cmp = NULL;854 result = FAILED;855 scmd_printk(KERN_DEBUG, cmd,856 "Failed to get completion for aborted cmd %p\n",857 cmd);858 goto out;859 }860 861 /*862 * Successfully aborted the command.863 */864 cmd->result = (DID_ABORT << 16);865 scsi_done(cmd);866 867out:868 spin_unlock_irqrestore(&adapter->hw_lock, flags);869 return result;870}871 872/*873 * Abort all outstanding requests. This is only safe to use if the completion874 * ring will never be walked again or the device has been reset, because it875 * destroys the 1-1 mapping between context field passed to emulation and our876 * request structure.877 */878static void pvscsi_reset_all(struct pvscsi_adapter *adapter)879{880 unsigned i;881 882 for (i = 0; i < adapter->req_depth; i++) {883 struct pvscsi_ctx *ctx = &adapter->cmd_map[i];884 struct scsi_cmnd *cmd = ctx->cmd;885 if (cmd) {886 scmd_printk(KERN_ERR, cmd,887 "Forced reset on cmd %p\n", cmd);888 pvscsi_unmap_buffers(adapter, ctx);889 pvscsi_patch_sense(cmd);890 pvscsi_release_context(adapter, ctx);891 cmd->result = (DID_RESET << 16);892 scsi_done(cmd);893 }894 }895}896 897static int pvscsi_host_reset(struct scsi_cmnd *cmd)898{899 struct Scsi_Host *host = cmd->device->host;900 struct pvscsi_adapter *adapter = shost_priv(host);901 unsigned long flags;902 bool use_msg;903 904 scmd_printk(KERN_INFO, cmd, "SCSI Host reset\n");905 906 spin_lock_irqsave(&adapter->hw_lock, flags);907 908 use_msg = adapter->use_msg;909 910 if (use_msg) {911 adapter->use_msg = false;912 spin_unlock_irqrestore(&adapter->hw_lock, flags);913 914 /*915 * Now that we know that the ISR won't add more work on the916 * workqueue we can safely flush any outstanding work.917 */918 flush_workqueue(adapter->workqueue);919 spin_lock_irqsave(&adapter->hw_lock, flags);920 }921 922 /*923 * We're going to tear down the entire ring structure and set it back924 * up, so stalling new requests until all completions are flushed and925 * the rings are back in place.926 */927 928 pvscsi_process_request_ring(adapter);929 930 ll_adapter_reset(adapter);931 932 /*933 * Now process any completions. Note we do this AFTER adapter reset,934 * which is strange, but stops races where completions get posted935 * between processing the ring and issuing the reset. The backend will936 * not touch the ring memory after reset, so the immediately pre-reset937 * completion ring state is still valid.938 */939 pvscsi_process_completion_ring(adapter);940 941 pvscsi_reset_all(adapter);942 adapter->use_msg = use_msg;943 pvscsi_setup_all_rings(adapter);944 pvscsi_unmask_intr(adapter);945 946 spin_unlock_irqrestore(&adapter->hw_lock, flags);947 948 return SUCCESS;949}950 951static int pvscsi_bus_reset(struct scsi_cmnd *cmd)952{953 struct Scsi_Host *host = cmd->device->host;954 struct pvscsi_adapter *adapter = shost_priv(host);955 unsigned long flags;956 957 scmd_printk(KERN_INFO, cmd, "SCSI Bus reset\n");958 959 /*960 * We don't want to queue new requests for this bus after961 * flushing all pending requests to emulation, since new962 * requests could then sneak in during this bus reset phase,963 * so take the lock now.964 */965 spin_lock_irqsave(&adapter->hw_lock, flags);966 967 pvscsi_process_request_ring(adapter);968 ll_bus_reset(adapter);969 pvscsi_process_completion_ring(adapter);970 971 spin_unlock_irqrestore(&adapter->hw_lock, flags);972 973 return SUCCESS;974}975 976static int pvscsi_device_reset(struct scsi_cmnd *cmd)977{978 struct Scsi_Host *host = cmd->device->host;979 struct pvscsi_adapter *adapter = shost_priv(host);980 unsigned long flags;981 982 scmd_printk(KERN_INFO, cmd, "SCSI device reset on scsi%u:%u\n",983 host->host_no, cmd->device->id);984 985 /*986 * We don't want to queue new requests for this device after flushing987 * all pending requests to emulation, since new requests could then988 * sneak in during this device reset phase, so take the lock now.989 */990 spin_lock_irqsave(&adapter->hw_lock, flags);991 992 pvscsi_process_request_ring(adapter);993 ll_device_reset(adapter, cmd->device->id);994 pvscsi_process_completion_ring(adapter);995 996 spin_unlock_irqrestore(&adapter->hw_lock, flags);997 998 return SUCCESS;999}1000 1001static struct scsi_host_template pvscsi_template;1002 1003static const char *pvscsi_info(struct Scsi_Host *host)1004{1005 struct pvscsi_adapter *adapter = shost_priv(host);1006 static char buf[256];1007 1008 sprintf(buf, "VMware PVSCSI storage adapter rev %d, req/cmp/msg rings: "1009 "%u/%u/%u pages, cmd_per_lun=%u", adapter->rev,1010 adapter->req_pages, adapter->cmp_pages, adapter->msg_pages,1011 pvscsi_template.cmd_per_lun);1012 1013 return buf;1014}1015 1016static struct scsi_host_template pvscsi_template = {1017 .module = THIS_MODULE,1018 .name = "VMware PVSCSI Host Adapter",1019 .proc_name = "vmw_pvscsi",1020 .info = pvscsi_info,1021 .queuecommand = pvscsi_queue,1022 .this_id = -1,1023 .sg_tablesize = PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT,1024 .dma_boundary = UINT_MAX,1025 .max_sectors = 0xffff,1026 .change_queue_depth = pvscsi_change_queue_depth,1027 .eh_abort_handler = pvscsi_abort,1028 .eh_device_reset_handler = pvscsi_device_reset,1029 .eh_bus_reset_handler = pvscsi_bus_reset,1030 .eh_host_reset_handler = pvscsi_host_reset,1031};1032 1033static void pvscsi_process_msg(const struct pvscsi_adapter *adapter,1034 const struct PVSCSIRingMsgDesc *e)1035{1036 struct PVSCSIRingsState *s = adapter->rings_state;1037 struct Scsi_Host *host = adapter->host;1038 struct scsi_device *sdev;1039 1040 printk(KERN_INFO "vmw_pvscsi: msg type: 0x%x - MSG RING: %u/%u (%u) \n",1041 e->type, s->msgProdIdx, s->msgConsIdx, s->msgNumEntriesLog2);1042 1043 BUILD_BUG_ON(PVSCSI_MSG_LAST != 2);1044 1045 if (e->type == PVSCSI_MSG_DEV_ADDED) {1046 struct PVSCSIMsgDescDevStatusChanged *desc;1047 desc = (struct PVSCSIMsgDescDevStatusChanged *)e;1048 1049 printk(KERN_INFO1050 "vmw_pvscsi: msg: device added at scsi%u:%u:%u\n",1051 desc->bus, desc->target, desc->lun[1]);1052 1053 if (!scsi_host_get(host))1054 return;1055 1056 sdev = scsi_device_lookup(host, desc->bus, desc->target,1057 desc->lun[1]);1058 if (sdev) {1059 printk(KERN_INFO "vmw_pvscsi: device already exists\n");1060 scsi_device_put(sdev);1061 } else1062 scsi_add_device(adapter->host, desc->bus,1063 desc->target, desc->lun[1]);1064 1065 scsi_host_put(host);1066 } else if (e->type == PVSCSI_MSG_DEV_REMOVED) {1067 struct PVSCSIMsgDescDevStatusChanged *desc;1068 desc = (struct PVSCSIMsgDescDevStatusChanged *)e;1069 1070 printk(KERN_INFO1071 "vmw_pvscsi: msg: device removed at scsi%u:%u:%u\n",1072 desc->bus, desc->target, desc->lun[1]);1073 1074 if (!scsi_host_get(host))1075 return;1076 1077 sdev = scsi_device_lookup(host, desc->bus, desc->target,1078 desc->lun[1]);1079 if (sdev) {1080 scsi_remove_device(sdev);1081 scsi_device_put(sdev);1082 } else1083 printk(KERN_INFO1084 "vmw_pvscsi: failed to lookup scsi%u:%u:%u\n",1085 desc->bus, desc->target, desc->lun[1]);1086 1087 scsi_host_put(host);1088 }1089}1090 1091static int pvscsi_msg_pending(const struct pvscsi_adapter *adapter)1092{1093 struct PVSCSIRingsState *s = adapter->rings_state;1094 1095 return s->msgProdIdx != s->msgConsIdx;1096}1097 1098static void pvscsi_process_msg_ring(const struct pvscsi_adapter *adapter)1099{1100 struct PVSCSIRingsState *s = adapter->rings_state;1101 struct PVSCSIRingMsgDesc *ring = adapter->msg_ring;1102 u32 msg_entries = s->msgNumEntriesLog2;1103 1104 while (pvscsi_msg_pending(adapter)) {1105 struct PVSCSIRingMsgDesc *e = ring + (s->msgConsIdx &1106 MASK(msg_entries));1107 1108 barrier();1109 pvscsi_process_msg(adapter, e);1110 barrier();1111 s->msgConsIdx++;1112 }1113}1114 1115static void pvscsi_msg_workqueue_handler(struct work_struct *data)1116{1117 struct pvscsi_adapter *adapter;1118 1119 adapter = container_of(data, struct pvscsi_adapter, work);1120 1121 pvscsi_process_msg_ring(adapter);1122}1123 1124static int pvscsi_setup_msg_workqueue(struct pvscsi_adapter *adapter)1125{1126 char name[32];1127 1128 if (!pvscsi_use_msg)1129 return 0;1130 1131 pvscsi_reg_write(adapter, PVSCSI_REG_OFFSET_COMMAND,1132 PVSCSI_CMD_SETUP_MSG_RING);1133 1134 if (pvscsi_reg_read(adapter, PVSCSI_REG_OFFSET_COMMAND_STATUS) == -1)1135 return 0;1136 1137 snprintf(name, sizeof(name),1138 "vmw_pvscsi_wq_%u", adapter->host->host_no);1139 1140 adapter->workqueue =1141 alloc_ordered_workqueue("%s", WQ_MEM_RECLAIM, name);1142 if (!adapter->workqueue) {1143 printk(KERN_ERR "vmw_pvscsi: failed to create work queue\n");1144 return 0;1145 }1146 INIT_WORK(&adapter->work, pvscsi_msg_workqueue_handler);1147 1148 return 1;1149}1150 1151static bool pvscsi_setup_req_threshold(struct pvscsi_adapter *adapter,1152 bool enable)1153{1154 u32 val;1155 1156 if (!pvscsi_use_req_threshold)1157 return false;1158 1159 pvscsi_reg_write(adapter, PVSCSI_REG_OFFSET_COMMAND,1160 PVSCSI_CMD_SETUP_REQCALLTHRESHOLD);1161 val = pvscsi_reg_read(adapter, PVSCSI_REG_OFFSET_COMMAND_STATUS);1162 if (val == -1) {1163 printk(KERN_INFO "vmw_pvscsi: device does not support req_threshold\n");1164 return false;1165 } else {1166 struct PVSCSICmdDescSetupReqCall cmd_msg = { 0 };1167 cmd_msg.enable = enable;1168 printk(KERN_INFO1169 "vmw_pvscsi: %sabling reqCallThreshold\n",1170 enable ? "en" : "dis");1171 pvscsi_write_cmd_desc(adapter,1172 PVSCSI_CMD_SETUP_REQCALLTHRESHOLD,1173 &cmd_msg, sizeof(cmd_msg));1174 return pvscsi_reg_read(adapter,1175 PVSCSI_REG_OFFSET_COMMAND_STATUS) != 0;1176 }1177}1178 1179static irqreturn_t pvscsi_isr(int irq, void *devp)1180{1181 struct pvscsi_adapter *adapter = devp;1182 unsigned long flags;1183 1184 spin_lock_irqsave(&adapter->hw_lock, flags);1185 pvscsi_process_completion_ring(adapter);1186 if (adapter->use_msg && pvscsi_msg_pending(adapter))1187 queue_work(adapter->workqueue, &adapter->work);1188 spin_unlock_irqrestore(&adapter->hw_lock, flags);1189 1190 return IRQ_HANDLED;1191}1192 1193static irqreturn_t pvscsi_shared_isr(int irq, void *devp)1194{1195 struct pvscsi_adapter *adapter = devp;1196 u32 val = pvscsi_read_intr_status(adapter);1197 1198 if (!(val & PVSCSI_INTR_ALL_SUPPORTED))1199 return IRQ_NONE;1200 pvscsi_write_intr_status(devp, val);1201 return pvscsi_isr(irq, devp);1202}1203 1204static void pvscsi_free_sgls(const struct pvscsi_adapter *adapter)1205{1206 struct pvscsi_ctx *ctx = adapter->cmd_map;1207 unsigned i;1208 1209 for (i = 0; i < adapter->req_depth; ++i, ++ctx)1210 free_pages((unsigned long)ctx->sgl, get_order(SGL_SIZE));1211}1212 1213static void pvscsi_shutdown_intr(struct pvscsi_adapter *adapter)1214{1215 free_irq(pci_irq_vector(adapter->dev, 0), adapter);1216 pci_free_irq_vectors(adapter->dev);1217}1218 1219static void pvscsi_release_resources(struct pvscsi_adapter *adapter)1220{1221 if (adapter->workqueue)1222 destroy_workqueue(adapter->workqueue);1223 1224 if (adapter->mmioBase)1225 pci_iounmap(adapter->dev, adapter->mmioBase);1226 1227 pci_release_regions(adapter->dev);1228 1229 if (adapter->cmd_map) {1230 pvscsi_free_sgls(adapter);1231 kfree(adapter->cmd_map);1232 }1233 1234 if (adapter->rings_state)1235 dma_free_coherent(&adapter->dev->dev, PAGE_SIZE,1236 adapter->rings_state, adapter->ringStatePA);1237 1238 if (adapter->req_ring)1239 dma_free_coherent(&adapter->dev->dev,1240 adapter->req_pages * PAGE_SIZE,1241 adapter->req_ring, adapter->reqRingPA);1242 1243 if (adapter->cmp_ring)1244 dma_free_coherent(&adapter->dev->dev,1245 adapter->cmp_pages * PAGE_SIZE,1246 adapter->cmp_ring, adapter->cmpRingPA);1247 1248 if (adapter->msg_ring)1249 dma_free_coherent(&adapter->dev->dev,1250 adapter->msg_pages * PAGE_SIZE,1251 adapter->msg_ring, adapter->msgRingPA);1252}1253 1254/*1255 * Allocate scatter gather lists.1256 *1257 * These are statically allocated. Trying to be clever was not worth it.1258 *1259 * Dynamic allocation can fail, and we can't go deep into the memory1260 * allocator, since we're a SCSI driver, and trying too hard to allocate1261 * memory might generate disk I/O. We also don't want to fail disk I/O1262 * in that case because we can't get an allocation - the I/O could be1263 * trying to swap out data to free memory. Since that is pathological,1264 * just use a statically allocated scatter list.1265 *1266 */1267static int pvscsi_allocate_sg(struct pvscsi_adapter *adapter)1268{1269 struct pvscsi_ctx *ctx;1270 int i;1271 1272 ctx = adapter->cmd_map;1273 BUILD_BUG_ON(sizeof(struct pvscsi_sg_list) > SGL_SIZE);1274 1275 for (i = 0; i < adapter->req_depth; ++i, ++ctx) {1276 ctx->sgl = (void *)__get_free_pages(GFP_KERNEL,1277 get_order(SGL_SIZE));1278 ctx->sglPA = 0;1279 BUG_ON(!IS_ALIGNED(((unsigned long)ctx->sgl), PAGE_SIZE));1280 if (!ctx->sgl) {1281 for (; i >= 0; --i, --ctx) {1282 free_pages((unsigned long)ctx->sgl,1283 get_order(SGL_SIZE));1284 ctx->sgl = NULL;1285 }1286 return -ENOMEM;1287 }1288 }1289 1290 return 0;1291}1292 1293/*1294 * Query the device, fetch the config info and return the1295 * maximum number of targets on the adapter. In case of1296 * failure due to any reason return default i.e. 16.1297 */1298static u32 pvscsi_get_max_targets(struct pvscsi_adapter *adapter)1299{1300 struct PVSCSICmdDescConfigCmd cmd;1301 struct PVSCSIConfigPageHeader *header;1302 struct device *dev;1303 dma_addr_t configPagePA;1304 void *config_page;1305 u32 numPhys = 16;1306 1307 dev = pvscsi_dev(adapter);1308 config_page = dma_alloc_coherent(&adapter->dev->dev, PAGE_SIZE,1309 &configPagePA, GFP_KERNEL);1310 if (!config_page) {1311 dev_warn(dev, "vmw_pvscsi: failed to allocate memory for config page\n");1312 goto exit;1313 }1314 BUG_ON(configPagePA & ~PAGE_MASK);1315 1316 /* Fetch config info from the device. */1317 cmd.configPageAddress = ((u64)PVSCSI_CONFIG_CONTROLLER_ADDRESS) << 32;1318 cmd.configPageNum = PVSCSI_CONFIG_PAGE_CONTROLLER;1319 cmd.cmpAddr = configPagePA;1320 cmd._pad = 0;1321 1322 /*1323 * Mark the completion page header with error values. If the device1324 * completes the command successfully, it sets the status values to1325 * indicate success.1326 */1327 header = config_page;1328 header->hostStatus = BTSTAT_INVPARAM;1329 header->scsiStatus = SDSTAT_CHECK;1330 1331 pvscsi_write_cmd_desc(adapter, PVSCSI_CMD_CONFIG, &cmd, sizeof cmd);1332 1333 if (header->hostStatus == BTSTAT_SUCCESS &&1334 header->scsiStatus == SDSTAT_GOOD) {1335 struct PVSCSIConfigPageController *config;1336 1337 config = config_page;1338 numPhys = config->numPhys;1339 } else1340 dev_warn(dev, "vmw_pvscsi: PVSCSI_CMD_CONFIG failed. hostStatus = 0x%x, scsiStatus = 0x%x\n",1341 header->hostStatus, header->scsiStatus);1342 dma_free_coherent(&adapter->dev->dev, PAGE_SIZE, config_page,1343 configPagePA);1344exit:1345 return numPhys;1346}1347 1348static int pvscsi_probe(struct pci_dev *pdev, const struct pci_device_id *id)1349{1350 unsigned int irq_flag = PCI_IRQ_ALL_TYPES;1351 struct pvscsi_adapter *adapter;1352 struct pvscsi_adapter adapter_temp;1353 struct Scsi_Host *host = NULL;1354 unsigned int i;1355 int error;1356 u32 max_id;1357 1358 error = -ENODEV;1359 1360 if (pci_enable_device(pdev))1361 return error;1362 1363 if (!dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64))) {1364 printk(KERN_INFO "vmw_pvscsi: using 64bit dma\n");1365 } else if (!dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) {1366 printk(KERN_INFO "vmw_pvscsi: using 32bit dma\n");1367 } else {1368 printk(KERN_ERR "vmw_pvscsi: failed to set DMA mask\n");1369 goto out_disable_device;1370 }1371 1372 /*1373 * Let's use a temp pvscsi_adapter struct until we find the number of1374 * targets on the adapter, after that we will switch to the real1375 * allocated struct.1376 */1377 adapter = &adapter_temp;1378 memset(adapter, 0, sizeof(*adapter));1379 adapter->dev = pdev;1380 adapter->rev = pdev->revision;1381 1382 if (pci_request_regions(pdev, "vmw_pvscsi")) {1383 printk(KERN_ERR "vmw_pvscsi: pci memory selection failed\n");1384 goto out_disable_device;1385 }1386 1387 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {1388 if ((pci_resource_flags(pdev, i) & PCI_BASE_ADDRESS_SPACE_IO))1389 continue;1390 1391 if (pci_resource_len(pdev, i) < PVSCSI_MEM_SPACE_SIZE)1392 continue;1393 1394 break;1395 }1396 1397 if (i == DEVICE_COUNT_RESOURCE) {1398 printk(KERN_ERR1399 "vmw_pvscsi: adapter has no suitable MMIO region\n");1400 goto out_release_resources_and_disable;1401 }1402 1403 adapter->mmioBase = pci_iomap(pdev, i, PVSCSI_MEM_SPACE_SIZE);1404 1405 if (!adapter->mmioBase) {1406 printk(KERN_ERR1407 "vmw_pvscsi: can't iomap for BAR %d memsize %lu\n",1408 i, PVSCSI_MEM_SPACE_SIZE);1409 goto out_release_resources_and_disable;1410 }1411 1412 pci_set_master(pdev);1413 1414 /*1415 * Ask the device for max number of targets before deciding the1416 * default pvscsi_ring_pages value.1417 */1418 max_id = pvscsi_get_max_targets(adapter);1419 printk(KERN_INFO "vmw_pvscsi: max_id: %u\n", max_id);1420 1421 if (pvscsi_ring_pages == 0)1422 /*1423 * Set the right default value. Up to 16 it is 8, above it is1424 * max.1425 */1426 pvscsi_ring_pages = (max_id > 16) ?1427 PVSCSI_SETUP_RINGS_MAX_NUM_PAGES :1428 PVSCSI_DEFAULT_NUM_PAGES_PER_RING;1429 printk(KERN_INFO1430 "vmw_pvscsi: setting ring_pages to %d\n",1431 pvscsi_ring_pages);1432 1433 pvscsi_template.can_queue =1434 min(PVSCSI_MAX_NUM_PAGES_REQ_RING, pvscsi_ring_pages) *1435 PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE;1436 pvscsi_template.cmd_per_lun =1437 min(pvscsi_template.can_queue, pvscsi_cmd_per_lun);1438 host = scsi_host_alloc(&pvscsi_template, sizeof(struct pvscsi_adapter));1439 if (!host) {1440 printk(KERN_ERR "vmw_pvscsi: failed to allocate host\n");1441 goto out_release_resources_and_disable;1442 }1443 1444 /*1445 * Let's use the real pvscsi_adapter struct here onwards.1446 */1447 adapter = shost_priv(host);1448 memset(adapter, 0, sizeof(*adapter));1449 adapter->dev = pdev;1450 adapter->host = host;1451 /*1452 * Copy back what we already have to the allocated adapter struct.1453 */1454 adapter->rev = adapter_temp.rev;1455 adapter->mmioBase = adapter_temp.mmioBase;1456 1457 spin_lock_init(&adapter->hw_lock);1458 host->max_channel = 0;1459 host->max_lun = 1;1460 host->max_cmd_len = 16;1461 host->max_id = max_id;1462 1463 pci_set_drvdata(pdev, host);1464 1465 ll_adapter_reset(adapter);1466 1467 adapter->use_msg = pvscsi_setup_msg_workqueue(adapter);1468 1469 error = pvscsi_allocate_rings(adapter);1470 if (error) {1471 printk(KERN_ERR "vmw_pvscsi: unable to allocate ring memory\n");1472 goto out_release_resources;1473 }1474 1475 /*1476 * From this point on we should reset the adapter if anything goes1477 * wrong.1478 */1479 pvscsi_setup_all_rings(adapter);1480 1481 adapter->cmd_map = kcalloc(adapter->req_depth,1482 sizeof(struct pvscsi_ctx), GFP_KERNEL);1483 if (!adapter->cmd_map) {1484 printk(KERN_ERR "vmw_pvscsi: failed to allocate memory.\n");1485 error = -ENOMEM;1486 goto out_reset_adapter;1487 }1488 1489 INIT_LIST_HEAD(&adapter->cmd_pool);1490 for (i = 0; i < adapter->req_depth; i++) {1491 struct pvscsi_ctx *ctx = adapter->cmd_map + i;1492 list_add(&ctx->list, &adapter->cmd_pool);1493 }1494 1495 error = pvscsi_allocate_sg(adapter);1496 if (error) {1497 printk(KERN_ERR "vmw_pvscsi: unable to allocate s/g table\n");1498 goto out_reset_adapter;1499 }1500 1501 if (pvscsi_disable_msix)1502 irq_flag &= ~PCI_IRQ_MSIX;1503 if (pvscsi_disable_msi)1504 irq_flag &= ~PCI_IRQ_MSI;1505 1506 error = pci_alloc_irq_vectors(adapter->dev, 1, 1, irq_flag);1507 if (error < 0)1508 goto out_reset_adapter;1509 1510 adapter->use_req_threshold = pvscsi_setup_req_threshold(adapter, true);1511 printk(KERN_DEBUG "vmw_pvscsi: driver-based request coalescing %sabled\n",1512 adapter->use_req_threshold ? "en" : "dis");1513 1514 if (adapter->dev->msix_enabled || adapter->dev->msi_enabled) {1515 printk(KERN_INFO "vmw_pvscsi: using MSI%s\n",1516 adapter->dev->msix_enabled ? "-X" : "");1517 error = request_irq(pci_irq_vector(pdev, 0), pvscsi_isr,1518 0, "vmw_pvscsi", adapter);1519 } else {1520 printk(KERN_INFO "vmw_pvscsi: using INTx\n");1521 error = request_irq(pci_irq_vector(pdev, 0), pvscsi_shared_isr,1522 IRQF_SHARED, "vmw_pvscsi", adapter);1523 }1524 1525 if (error) {1526 printk(KERN_ERR1527 "vmw_pvscsi: unable to request IRQ: %d\n", error);1528 goto out_reset_adapter;1529 }1530 1531 error = scsi_add_host(host, &pdev->dev);1532 if (error) {1533 printk(KERN_ERR1534 "vmw_pvscsi: scsi_add_host failed: %d\n", error);1535 goto out_reset_adapter;1536 }1537 1538 dev_info(&pdev->dev, "VMware PVSCSI rev %d host #%u\n",1539 adapter->rev, host->host_no);1540 1541 pvscsi_unmask_intr(adapter);1542 1543 scsi_scan_host(host);1544 1545 return 0;1546 1547out_reset_adapter:1548 ll_adapter_reset(adapter);1549out_release_resources:1550 pvscsi_shutdown_intr(adapter);1551 pvscsi_release_resources(adapter);1552 scsi_host_put(host);1553out_disable_device:1554 pci_disable_device(pdev);1555 1556 return error;1557 1558out_release_resources_and_disable:1559 pvscsi_shutdown_intr(adapter);1560 pvscsi_release_resources(adapter);1561 goto out_disable_device;1562}1563 1564static void __pvscsi_shutdown(struct pvscsi_adapter *adapter)1565{1566 pvscsi_mask_intr(adapter);1567 1568 if (adapter->workqueue)1569 flush_workqueue(adapter->workqueue);1570 1571 pvscsi_shutdown_intr(adapter);1572 1573 pvscsi_process_request_ring(adapter);1574 pvscsi_process_completion_ring(adapter);1575 ll_adapter_reset(adapter);1576}1577 1578static void pvscsi_shutdown(struct pci_dev *dev)1579{1580 struct Scsi_Host *host = pci_get_drvdata(dev);1581 struct pvscsi_adapter *adapter = shost_priv(host);1582 1583 __pvscsi_shutdown(adapter);1584}1585 1586static void pvscsi_remove(struct pci_dev *pdev)1587{1588 struct Scsi_Host *host = pci_get_drvdata(pdev);1589 struct pvscsi_adapter *adapter = shost_priv(host);1590 1591 scsi_remove_host(host);1592 1593 __pvscsi_shutdown(adapter);1594 pvscsi_release_resources(adapter);1595 1596 scsi_host_put(host);1597 1598 pci_disable_device(pdev);1599}1600 1601static struct pci_driver pvscsi_pci_driver = {1602 .name = "vmw_pvscsi",1603 .id_table = pvscsi_pci_tbl,1604 .probe = pvscsi_probe,1605 .remove = pvscsi_remove,1606 .shutdown = pvscsi_shutdown,1607};1608 1609static int __init pvscsi_init(void)1610{1611 pr_info("%s - version %s\n",1612 PVSCSI_LINUX_DRIVER_DESC, PVSCSI_DRIVER_VERSION_STRING);1613 return pci_register_driver(&pvscsi_pci_driver);1614}1615 1616static void __exit pvscsi_exit(void)1617{1618 pci_unregister_driver(&pvscsi_pci_driver);1619}1620 1621module_init(pvscsi_init);1622module_exit(pvscsi_exit);1623