brintos

brintos / linux-shallow public Read only

0
0
Text · 151.3 KiB · 4c58819 Raw
5443 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * pmcraid.c -- driver for PMC Sierra MaxRAID controller adapters4 *5 * Written By: Anil Ravindranath<anil_ravindranath@pmc-sierra.com>6 *             PMC-Sierra Inc7 *8 * Copyright (C) 2008, 2009 PMC Sierra Inc9 */10#include <linux/fs.h>11#include <linux/init.h>12#include <linux/types.h>13#include <linux/errno.h>14#include <linux/kernel.h>15#include <linux/ioport.h>16#include <linux/delay.h>17#include <linux/pci.h>18#include <linux/wait.h>19#include <linux/spinlock.h>20#include <linux/sched.h>21#include <linux/interrupt.h>22#include <linux/blkdev.h>23#include <linux/firmware.h>24#include <linux/module.h>25#include <linux/moduleparam.h>26#include <linux/hdreg.h>27#include <linux/io.h>28#include <linux/slab.h>29#include <asm/irq.h>30#include <asm/processor.h>31#include <linux/libata.h>32#include <linux/mutex.h>33#include <linux/ktime.h>34#include <scsi/scsi.h>35#include <scsi/scsi_host.h>36#include <scsi/scsi_device.h>37#include <scsi/scsi_tcq.h>38#include <scsi/scsi_eh.h>39#include <scsi/scsi_cmnd.h>40#include <scsi/scsicam.h>41 42#include "pmcraid.h"43 44/*45 *   Module configuration parameters46 */47static unsigned int pmcraid_debug_log;48static unsigned int pmcraid_disable_aen;49static unsigned int pmcraid_log_level = IOASC_LOG_LEVEL_MUST;50static unsigned int pmcraid_enable_msix;51 52/*53 * Data structures to support multiple adapters by the LLD.54 * pmcraid_adapter_count - count of configured adapters55 */56static atomic_t pmcraid_adapter_count = ATOMIC_INIT(0);57 58/*59 * Supporting user-level control interface through IOCTL commands.60 * pmcraid_major - major number to use61 * pmcraid_minor - minor number(s) to use62 */63static unsigned int pmcraid_major;64static const struct class pmcraid_class = {65	.name = PMCRAID_DEVFILE,66};67static DECLARE_BITMAP(pmcraid_minor, PMCRAID_MAX_ADAPTERS);68 69/*70 * Module parameters71 */72MODULE_AUTHOR("Anil Ravindranath<anil_ravindranath@pmc-sierra.com>");73MODULE_DESCRIPTION("PMC Sierra MaxRAID Controller Driver");74MODULE_LICENSE("GPL");75MODULE_VERSION(PMCRAID_DRIVER_VERSION);76 77module_param_named(log_level, pmcraid_log_level, uint, (S_IRUGO | S_IWUSR));78MODULE_PARM_DESC(log_level,79		 "Enables firmware error code logging, default :1 high-severity"80		 " errors, 2: all errors including high-severity errors,"81		 " 0: disables logging");82 83module_param_named(debug, pmcraid_debug_log, uint, (S_IRUGO | S_IWUSR));84MODULE_PARM_DESC(debug,85		 "Enable driver verbose message logging. Set 1 to enable."86		 "(default: 0)");87 88module_param_named(disable_aen, pmcraid_disable_aen, uint, (S_IRUGO | S_IWUSR));89MODULE_PARM_DESC(disable_aen,90		 "Disable driver aen notifications to apps. Set 1 to disable."91		 "(default: 0)");92 93/* chip specific constants for PMC MaxRAID controllers (same for94 * 0x5220 and 0x801095 */96static struct pmcraid_chip_details pmcraid_chip_cfg[] = {97	{98	 .ioastatus = 0x0,99	 .ioarrin = 0x00040,100	 .mailbox = 0x7FC30,101	 .global_intr_mask = 0x00034,102	 .ioa_host_intr = 0x0009C,103	 .ioa_host_intr_clr = 0x000A0,104	 .ioa_host_msix_intr = 0x7FC40,105	 .ioa_host_mask = 0x7FC28,106	 .ioa_host_mask_clr = 0x7FC28,107	 .host_ioa_intr = 0x00020,108	 .host_ioa_intr_clr = 0x00020,109	 .transop_timeout = 300110	 }111};112 113/*114 * PCI device ids supported by pmcraid driver115 */116static struct pci_device_id pmcraid_pci_table[] = {117	{ PCI_DEVICE(PCI_VENDOR_ID_PMC, PCI_DEVICE_ID_PMC_MAXRAID),118	  0, 0, (kernel_ulong_t)&pmcraid_chip_cfg[0]119	},120	{}121};122 123MODULE_DEVICE_TABLE(pci, pmcraid_pci_table);124 125 126 127/**128 * pmcraid_slave_alloc - Prepare for commands to a device129 * @scsi_dev: scsi device struct130 *131 * This function is called by mid-layer prior to sending any command to the new132 * device. Stores resource entry details of the device in scsi_device struct.133 * Queuecommand uses the resource handle and other details to fill up IOARCB134 * while sending commands to the device.135 *136 * Return value:137 *	  0 on success / -ENXIO if device does not exist138 */139static int pmcraid_slave_alloc(struct scsi_device *scsi_dev)140{141	struct pmcraid_resource_entry *temp, *res = NULL;142	struct pmcraid_instance *pinstance;143	u8 target, bus, lun;144	unsigned long lock_flags;145	int rc = -ENXIO;146	u16 fw_version;147 148	pinstance = shost_priv(scsi_dev->host);149 150	fw_version = be16_to_cpu(pinstance->inq_data->fw_version);151 152	/* Driver exposes VSET and GSCSI resources only; all other device types153	 * are not exposed. Resource list is synchronized using resource lock154	 * so any traversal or modifications to the list should be done inside155	 * this lock156	 */157	spin_lock_irqsave(&pinstance->resource_lock, lock_flags);158	list_for_each_entry(temp, &pinstance->used_res_q, queue) {159 160		/* do not expose VSETs with order-ids > MAX_VSET_TARGETS */161		if (RES_IS_VSET(temp->cfg_entry)) {162			if (fw_version <= PMCRAID_FW_VERSION_1)163				target = temp->cfg_entry.unique_flags1;164			else165				target = le16_to_cpu(temp->cfg_entry.array_id) & 0xFF;166 167			if (target > PMCRAID_MAX_VSET_TARGETS)168				continue;169			bus = PMCRAID_VSET_BUS_ID;170			lun = 0;171		} else if (RES_IS_GSCSI(temp->cfg_entry)) {172			target = RES_TARGET(temp->cfg_entry.resource_address);173			bus = PMCRAID_PHYS_BUS_ID;174			lun = RES_LUN(temp->cfg_entry.resource_address);175		} else {176			continue;177		}178 179		if (bus == scsi_dev->channel &&180		    target == scsi_dev->id &&181		    lun == scsi_dev->lun) {182			res = temp;183			break;184		}185	}186 187	if (res) {188		res->scsi_dev = scsi_dev;189		scsi_dev->hostdata = res;190		res->change_detected = 0;191		atomic_set(&res->read_failures, 0);192		atomic_set(&res->write_failures, 0);193		rc = 0;194	}195	spin_unlock_irqrestore(&pinstance->resource_lock, lock_flags);196	return rc;197}198 199/**200 * pmcraid_device_configure - Configures a SCSI device201 * @scsi_dev: scsi device struct202 * @lim: queue limits203 *204 * This function is executed by SCSI mid layer just after a device is first205 * scanned (i.e. it has responded to an INQUIRY). For VSET resources, the206 * timeout value (default 30s) will be over-written to a higher value (60s)207 * and max_sectors value will be over-written to 512. It also sets queue depth208 * to host->cmd_per_lun value209 *210 * Return value:211 *	  0 on success212 */213static int pmcraid_device_configure(struct scsi_device *scsi_dev,214		struct queue_limits *lim)215{216	struct pmcraid_resource_entry *res = scsi_dev->hostdata;217 218	if (!res)219		return 0;220 221	/* LLD exposes VSETs and Enclosure devices only */222	if (RES_IS_GSCSI(res->cfg_entry) &&223	    scsi_dev->type != TYPE_ENCLOSURE)224		return -ENXIO;225 226	pmcraid_info("configuring %x:%x:%x:%x\n",227		     scsi_dev->host->unique_id,228		     scsi_dev->channel,229		     scsi_dev->id,230		     (u8)scsi_dev->lun);231 232	if (RES_IS_GSCSI(res->cfg_entry)) {233		scsi_dev->allow_restart = 1;234	} else if (RES_IS_VSET(res->cfg_entry)) {235		scsi_dev->allow_restart = 1;236		blk_queue_rq_timeout(scsi_dev->request_queue,237				     PMCRAID_VSET_IO_TIMEOUT);238		lim->max_hw_sectors = PMCRAID_VSET_MAX_SECTORS;239	}240 241	/*242	 * We never want to report TCQ support for these types of devices.243	 */244	if (!RES_IS_GSCSI(res->cfg_entry) && !RES_IS_VSET(res->cfg_entry))245		scsi_dev->tagged_supported = 0;246 247	return 0;248}249 250/**251 * pmcraid_slave_destroy - Unconfigure a SCSI device before removing it252 *253 * @scsi_dev: scsi device struct254 *255 * This is called by mid-layer before removing a device. Pointer assignments256 * done in pmcraid_slave_alloc will be reset to NULL here.257 *258 * Return value259 *   none260 */261static void pmcraid_slave_destroy(struct scsi_device *scsi_dev)262{263	struct pmcraid_resource_entry *res;264 265	res = (struct pmcraid_resource_entry *)scsi_dev->hostdata;266 267	if (res)268		res->scsi_dev = NULL;269 270	scsi_dev->hostdata = NULL;271}272 273/**274 * pmcraid_change_queue_depth - Change the device's queue depth275 * @scsi_dev: scsi device struct276 * @depth: depth to set277 *278 * Return value279 *	actual depth set280 */281static int pmcraid_change_queue_depth(struct scsi_device *scsi_dev, int depth)282{283	if (depth > PMCRAID_MAX_CMD_PER_LUN)284		depth = PMCRAID_MAX_CMD_PER_LUN;285	return scsi_change_queue_depth(scsi_dev, depth);286}287 288/**289 * pmcraid_init_cmdblk - initializes a command block290 *291 * @cmd: pointer to struct pmcraid_cmd to be initialized292 * @index: if >=0 first time initialization; otherwise reinitialization293 *294 * Return Value295 *	 None296 */297static void pmcraid_init_cmdblk(struct pmcraid_cmd *cmd, int index)298{299	struct pmcraid_ioarcb *ioarcb = &(cmd->ioa_cb->ioarcb);300	dma_addr_t dma_addr = cmd->ioa_cb_bus_addr;301 302	if (index >= 0) {303		/* first time initialization (called from  probe) */304		u32 ioasa_offset =305			offsetof(struct pmcraid_control_block, ioasa);306 307		cmd->index = index;308		ioarcb->response_handle = cpu_to_le32(index << 2);309		ioarcb->ioarcb_bus_addr = cpu_to_le64(dma_addr);310		ioarcb->ioasa_bus_addr = cpu_to_le64(dma_addr + ioasa_offset);311		ioarcb->ioasa_len = cpu_to_le16(sizeof(struct pmcraid_ioasa));312	} else {313		/* re-initialization of various lengths, called once command is314		 * processed by IOA315		 */316		memset(&cmd->ioa_cb->ioarcb.cdb, 0, PMCRAID_MAX_CDB_LEN);317		ioarcb->hrrq_id = 0;318		ioarcb->request_flags0 = 0;319		ioarcb->request_flags1 = 0;320		ioarcb->cmd_timeout = 0;321		ioarcb->ioarcb_bus_addr &= cpu_to_le64(~0x1FULL);322		ioarcb->ioadl_bus_addr = 0;323		ioarcb->ioadl_length = 0;324		ioarcb->data_transfer_length = 0;325		ioarcb->add_cmd_param_length = 0;326		ioarcb->add_cmd_param_offset = 0;327		cmd->ioa_cb->ioasa.ioasc = 0;328		cmd->ioa_cb->ioasa.residual_data_length = 0;329		cmd->time_left = 0;330	}331 332	cmd->cmd_done = NULL;333	cmd->scsi_cmd = NULL;334	cmd->release = 0;335	cmd->completion_req = 0;336	cmd->sense_buffer = NULL;337	cmd->sense_buffer_dma = 0;338	cmd->dma_handle = 0;339	timer_setup(&cmd->timer, NULL, 0);340}341 342/**343 * pmcraid_reinit_cmdblk - reinitialize a command block344 *345 * @cmd: pointer to struct pmcraid_cmd to be reinitialized346 *347 * Return Value348 *	 None349 */350static void pmcraid_reinit_cmdblk(struct pmcraid_cmd *cmd)351{352	pmcraid_init_cmdblk(cmd, -1);353}354 355/**356 * pmcraid_get_free_cmd - get a free cmd block from command block pool357 * @pinstance: adapter instance structure358 *359 * Return Value:360 *	returns pointer to cmd block or NULL if no blocks are available361 */362static struct pmcraid_cmd *pmcraid_get_free_cmd(363	struct pmcraid_instance *pinstance364)365{366	struct pmcraid_cmd *cmd = NULL;367	unsigned long lock_flags;368 369	/* free cmd block list is protected by free_pool_lock */370	spin_lock_irqsave(&pinstance->free_pool_lock, lock_flags);371 372	if (!list_empty(&pinstance->free_cmd_pool)) {373		cmd = list_entry(pinstance->free_cmd_pool.next,374				 struct pmcraid_cmd, free_list);375		list_del(&cmd->free_list);376	}377	spin_unlock_irqrestore(&pinstance->free_pool_lock, lock_flags);378 379	/* Initialize the command block before giving it the caller */380	if (cmd != NULL)381		pmcraid_reinit_cmdblk(cmd);382	return cmd;383}384 385/**386 * pmcraid_return_cmd - return a completed command block back into free pool387 * @cmd: pointer to the command block388 *389 * Return Value:390 *	nothing391 */392static void pmcraid_return_cmd(struct pmcraid_cmd *cmd)393{394	struct pmcraid_instance *pinstance = cmd->drv_inst;395	unsigned long lock_flags;396 397	spin_lock_irqsave(&pinstance->free_pool_lock, lock_flags);398	list_add_tail(&cmd->free_list, &pinstance->free_cmd_pool);399	spin_unlock_irqrestore(&pinstance->free_pool_lock, lock_flags);400}401 402/**403 * pmcraid_read_interrupts -  reads IOA interrupts404 *405 * @pinstance: pointer to adapter instance structure406 *407 * Return value408 *	 interrupts read from IOA409 */410static u32 pmcraid_read_interrupts(struct pmcraid_instance *pinstance)411{412	return (pinstance->interrupt_mode) ?413		ioread32(pinstance->int_regs.ioa_host_msix_interrupt_reg) :414		ioread32(pinstance->int_regs.ioa_host_interrupt_reg);415}416 417/**418 * pmcraid_disable_interrupts - Masks and clears all specified interrupts419 *420 * @pinstance: pointer to per adapter instance structure421 * @intrs: interrupts to disable422 *423 * Return Value424 *	 None425 */426static void pmcraid_disable_interrupts(427	struct pmcraid_instance *pinstance,428	u32 intrs429)430{431	u32 gmask = ioread32(pinstance->int_regs.global_interrupt_mask_reg);432	u32 nmask = gmask | GLOBAL_INTERRUPT_MASK;433 434	iowrite32(intrs, pinstance->int_regs.ioa_host_interrupt_clr_reg);435	iowrite32(nmask, pinstance->int_regs.global_interrupt_mask_reg);436	ioread32(pinstance->int_regs.global_interrupt_mask_reg);437 438	if (!pinstance->interrupt_mode) {439		iowrite32(intrs,440			pinstance->int_regs.ioa_host_interrupt_mask_reg);441		ioread32(pinstance->int_regs.ioa_host_interrupt_mask_reg);442	}443}444 445/**446 * pmcraid_enable_interrupts - Enables specified interrupts447 *448 * @pinstance: pointer to per adapter instance structure449 * @intrs: interrupts to enable450 *451 * Return Value452 *	 None453 */454static void pmcraid_enable_interrupts(455	struct pmcraid_instance *pinstance,456	u32 intrs)457{458	u32 gmask = ioread32(pinstance->int_regs.global_interrupt_mask_reg);459	u32 nmask = gmask & (~GLOBAL_INTERRUPT_MASK);460 461	iowrite32(nmask, pinstance->int_regs.global_interrupt_mask_reg);462 463	if (!pinstance->interrupt_mode) {464		iowrite32(~intrs,465			 pinstance->int_regs.ioa_host_interrupt_mask_reg);466		ioread32(pinstance->int_regs.ioa_host_interrupt_mask_reg);467	}468 469	pmcraid_info("enabled interrupts global mask = %x intr_mask = %x\n",470		ioread32(pinstance->int_regs.global_interrupt_mask_reg),471		ioread32(pinstance->int_regs.ioa_host_interrupt_mask_reg));472}473 474/**475 * pmcraid_clr_trans_op - clear trans to op interrupt476 *477 * @pinstance: pointer to per adapter instance structure478 *479 * Return Value480 *	 None481 */482static void pmcraid_clr_trans_op(483	struct pmcraid_instance *pinstance484)485{486	unsigned long lock_flags;487 488	if (!pinstance->interrupt_mode) {489		iowrite32(INTRS_TRANSITION_TO_OPERATIONAL,490			pinstance->int_regs.ioa_host_interrupt_mask_reg);491		ioread32(pinstance->int_regs.ioa_host_interrupt_mask_reg);492		iowrite32(INTRS_TRANSITION_TO_OPERATIONAL,493			pinstance->int_regs.ioa_host_interrupt_clr_reg);494		ioread32(pinstance->int_regs.ioa_host_interrupt_clr_reg);495	}496 497	if (pinstance->reset_cmd != NULL) {498		del_timer(&pinstance->reset_cmd->timer);499		spin_lock_irqsave(500			pinstance->host->host_lock, lock_flags);501		pinstance->reset_cmd->cmd_done(pinstance->reset_cmd);502		spin_unlock_irqrestore(503			pinstance->host->host_lock, lock_flags);504	}505}506 507/**508 * pmcraid_reset_type - Determine the required reset type509 * @pinstance: pointer to adapter instance structure510 *511 * IOA requires hard reset if any of the following conditions is true.512 * 1. If HRRQ valid interrupt is not masked513 * 2. IOA reset alert doorbell is set514 * 3. If there are any error interrupts515 */516static void pmcraid_reset_type(struct pmcraid_instance *pinstance)517{518	u32 mask;519	u32 intrs;520	u32 alerts;521 522	mask = ioread32(pinstance->int_regs.ioa_host_interrupt_mask_reg);523	intrs = ioread32(pinstance->int_regs.ioa_host_interrupt_reg);524	alerts = ioread32(pinstance->int_regs.host_ioa_interrupt_reg);525 526	if ((mask & INTRS_HRRQ_VALID) == 0 ||527	    (alerts & DOORBELL_IOA_RESET_ALERT) ||528	    (intrs & PMCRAID_ERROR_INTERRUPTS)) {529		pmcraid_info("IOA requires hard reset\n");530		pinstance->ioa_hard_reset = 1;531	}532 533	/* If unit check is active, trigger the dump */534	if (intrs & INTRS_IOA_UNIT_CHECK)535		pinstance->ioa_unit_check = 1;536}537 538static void pmcraid_ioa_reset(struct pmcraid_cmd *);539/**540 * pmcraid_bist_done - completion function for PCI BIST541 * @t: pointer to reset command542 * Return Value543 *	none544 */545static void pmcraid_bist_done(struct timer_list *t)546{547	struct pmcraid_cmd *cmd = from_timer(cmd, t, timer);548	struct pmcraid_instance *pinstance = cmd->drv_inst;549	unsigned long lock_flags;550	int rc;551	u16 pci_reg;552 553	rc = pci_read_config_word(pinstance->pdev, PCI_COMMAND, &pci_reg);554 555	/* If PCI config space can't be accessed wait for another two secs */556	if ((rc != PCIBIOS_SUCCESSFUL || (!(pci_reg & PCI_COMMAND_MEMORY))) &&557	    cmd->time_left > 0) {558		pmcraid_info("BIST not complete, waiting another 2 secs\n");559		cmd->timer.expires = jiffies + cmd->time_left;560		cmd->time_left = 0;561		add_timer(&cmd->timer);562	} else {563		cmd->time_left = 0;564		pmcraid_info("BIST is complete, proceeding with reset\n");565		spin_lock_irqsave(pinstance->host->host_lock, lock_flags);566		pmcraid_ioa_reset(cmd);567		spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);568	}569}570 571/**572 * pmcraid_start_bist - starts BIST573 * @cmd: pointer to reset cmd574 * Return Value575 *   none576 */577static void pmcraid_start_bist(struct pmcraid_cmd *cmd)578{579	struct pmcraid_instance *pinstance = cmd->drv_inst;580	u32 doorbells, intrs;581 582	/* proceed with bist and wait for 2 seconds */583	iowrite32(DOORBELL_IOA_START_BIST,584		pinstance->int_regs.host_ioa_interrupt_reg);585	doorbells = ioread32(pinstance->int_regs.host_ioa_interrupt_reg);586	intrs = ioread32(pinstance->int_regs.ioa_host_interrupt_reg);587	pmcraid_info("doorbells after start bist: %x intrs: %x\n",588		      doorbells, intrs);589 590	cmd->time_left = msecs_to_jiffies(PMCRAID_BIST_TIMEOUT);591	cmd->timer.expires = jiffies + msecs_to_jiffies(PMCRAID_BIST_TIMEOUT);592	cmd->timer.function = pmcraid_bist_done;593	add_timer(&cmd->timer);594}595 596/**597 * pmcraid_reset_alert_done - completion routine for reset_alert598 * @t: pointer to command block used in reset sequence599 * Return value600 *  None601 */602static void pmcraid_reset_alert_done(struct timer_list *t)603{604	struct pmcraid_cmd *cmd = from_timer(cmd, t, timer);605	struct pmcraid_instance *pinstance = cmd->drv_inst;606	u32 status = ioread32(pinstance->ioa_status);607	unsigned long lock_flags;608 609	/* if the critical operation in progress bit is set or the wait times610	 * out, invoke reset engine to proceed with hard reset. If there is611	 * some more time to wait, restart the timer612	 */613	if (((status & INTRS_CRITICAL_OP_IN_PROGRESS) == 0) ||614	    cmd->time_left <= 0) {615		pmcraid_info("critical op is reset proceeding with reset\n");616		spin_lock_irqsave(pinstance->host->host_lock, lock_flags);617		pmcraid_ioa_reset(cmd);618		spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);619	} else {620		pmcraid_info("critical op is not yet reset waiting again\n");621		/* restart timer if some more time is available to wait */622		cmd->time_left -= PMCRAID_CHECK_FOR_RESET_TIMEOUT;623		cmd->timer.expires = jiffies + PMCRAID_CHECK_FOR_RESET_TIMEOUT;624		cmd->timer.function = pmcraid_reset_alert_done;625		add_timer(&cmd->timer);626	}627}628 629static void pmcraid_notify_ioastate(struct pmcraid_instance *, u32);630/**631 * pmcraid_reset_alert - alerts IOA for a possible reset632 * @cmd: command block to be used for reset sequence.633 *634 * Return Value635 *	returns 0 if pci config-space is accessible and RESET_DOORBELL is636 *	successfully written to IOA. Returns non-zero in case pci_config_space637 *	is not accessible638 */639static void pmcraid_reset_alert(struct pmcraid_cmd *cmd)640{641	struct pmcraid_instance *pinstance = cmd->drv_inst;642	u32 doorbells;643	int rc;644	u16 pci_reg;645 646	/* If we are able to access IOA PCI config space, alert IOA that we are647	 * going to reset it soon. This enables IOA to preserv persistent error648	 * data if any. In case memory space is not accessible, proceed with649	 * BIST or slot_reset650	 */651	rc = pci_read_config_word(pinstance->pdev, PCI_COMMAND, &pci_reg);652	if ((rc == PCIBIOS_SUCCESSFUL) && (pci_reg & PCI_COMMAND_MEMORY)) {653 654		/* wait for IOA permission i.e until CRITICAL_OPERATION bit is655		 * reset IOA doesn't generate any interrupts when CRITICAL656		 * OPERATION bit is reset. A timer is started to wait for this657		 * bit to be reset.658		 */659		cmd->time_left = PMCRAID_RESET_TIMEOUT;660		cmd->timer.expires = jiffies + PMCRAID_CHECK_FOR_RESET_TIMEOUT;661		cmd->timer.function = pmcraid_reset_alert_done;662		add_timer(&cmd->timer);663 664		iowrite32(DOORBELL_IOA_RESET_ALERT,665			pinstance->int_regs.host_ioa_interrupt_reg);666		doorbells =667			ioread32(pinstance->int_regs.host_ioa_interrupt_reg);668		pmcraid_info("doorbells after reset alert: %x\n", doorbells);669	} else {670		pmcraid_info("PCI config is not accessible starting BIST\n");671		pinstance->ioa_state = IOA_STATE_IN_HARD_RESET;672		pmcraid_start_bist(cmd);673	}674}675 676/**677 * pmcraid_timeout_handler -  Timeout handler for internally generated ops678 *679 * @t: pointer to command structure, that got timedout680 *681 * This function blocks host requests and initiates an adapter reset.682 *683 * Return value:684 *   None685 */686static void pmcraid_timeout_handler(struct timer_list *t)687{688	struct pmcraid_cmd *cmd = from_timer(cmd, t, timer);689	struct pmcraid_instance *pinstance = cmd->drv_inst;690	unsigned long lock_flags;691 692	dev_info(&pinstance->pdev->dev,693		"Adapter being reset due to cmd(CDB[0] = %x) timeout\n",694		cmd->ioa_cb->ioarcb.cdb[0]);695 696	/* Command timeouts result in hard reset sequence. The command that got697	 * timed out may be the one used as part of reset sequence. In this698	 * case restart reset sequence using the same command block even if699	 * reset is in progress. Otherwise fail this command and get a free700	 * command block to restart the reset sequence.701	 */702	spin_lock_irqsave(pinstance->host->host_lock, lock_flags);703	if (!pinstance->ioa_reset_in_progress) {704		pinstance->ioa_reset_attempts = 0;705		cmd = pmcraid_get_free_cmd(pinstance);706 707		/* If we are out of command blocks, just return here itself.708		 * Some other command's timeout handler can do the reset job709		 */710		if (cmd == NULL) {711			spin_unlock_irqrestore(pinstance->host->host_lock,712					       lock_flags);713			pmcraid_err("no free cmnd block for timeout handler\n");714			return;715		}716 717		pinstance->reset_cmd = cmd;718		pinstance->ioa_reset_in_progress = 1;719	} else {720		pmcraid_info("reset is already in progress\n");721 722		if (pinstance->reset_cmd != cmd) {723			/* This command should have been given to IOA, this724			 * command will be completed by fail_outstanding_cmds725			 * anyway726			 */727			pmcraid_err("cmd is pending but reset in progress\n");728		}729 730		/* If this command was being used as part of the reset731		 * sequence, set cmd_done pointer to pmcraid_ioa_reset. This732		 * causes fail_outstanding_commands not to return the command733		 * block back to free pool734		 */735		if (cmd == pinstance->reset_cmd)736			cmd->cmd_done = pmcraid_ioa_reset;737	}738 739	/* Notify apps of important IOA bringup/bringdown sequences */740	if (pinstance->scn.ioa_state != PMC_DEVICE_EVENT_RESET_START &&741	    pinstance->scn.ioa_state != PMC_DEVICE_EVENT_SHUTDOWN_START)742		pmcraid_notify_ioastate(pinstance,743					PMC_DEVICE_EVENT_RESET_START);744 745	pinstance->ioa_state = IOA_STATE_IN_RESET_ALERT;746	scsi_block_requests(pinstance->host);747	pmcraid_reset_alert(cmd);748	spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);749}750 751/**752 * pmcraid_internal_done - completion routine for internally generated cmds753 *754 * @cmd: command that got response from IOA755 *756 * Return Value:757 *	 none758 */759static void pmcraid_internal_done(struct pmcraid_cmd *cmd)760{761	pmcraid_info("response internal cmd CDB[0] = %x ioasc = %x\n",762		     cmd->ioa_cb->ioarcb.cdb[0],763		     le32_to_cpu(cmd->ioa_cb->ioasa.ioasc));764 765	/* Some of the internal commands are sent with callers blocking for the766	 * response. Same will be indicated as part of cmd->completion_req767	 * field. Response path needs to wake up any waiters waiting for cmd768	 * completion if this flag is set.769	 */770	if (cmd->completion_req) {771		cmd->completion_req = 0;772		complete(&cmd->wait_for_completion);773	}774 775	/* most of the internal commands are completed by caller itself, so776	 * no need to return the command block back to free pool until we are777	 * required to do so (e.g once done with initialization).778	 */779	if (cmd->release) {780		cmd->release = 0;781		pmcraid_return_cmd(cmd);782	}783}784 785/**786 * pmcraid_reinit_cfgtable_done - done function for cfg table reinitialization787 *788 * @cmd: command that got response from IOA789 *790 * This routine is called after driver re-reads configuration table due to a791 * lost CCN. It returns the command block back to free pool and schedules792 * worker thread to add/delete devices into the system.793 *794 * Return Value:795 *	 none796 */797static void pmcraid_reinit_cfgtable_done(struct pmcraid_cmd *cmd)798{799	pmcraid_info("response internal cmd CDB[0] = %x ioasc = %x\n",800		     cmd->ioa_cb->ioarcb.cdb[0],801		     le32_to_cpu(cmd->ioa_cb->ioasa.ioasc));802 803	if (cmd->release) {804		cmd->release = 0;805		pmcraid_return_cmd(cmd);806	}807	pmcraid_info("scheduling worker for config table reinitialization\n");808	schedule_work(&cmd->drv_inst->worker_q);809}810 811/**812 * pmcraid_erp_done - Process completion of SCSI error response from device813 * @cmd: pmcraid_command814 *815 * This function copies the sense buffer into the scsi_cmd struct and completes816 * scsi_cmd by calling scsi_done function.817 *818 * Return value:819 *  none820 */821static void pmcraid_erp_done(struct pmcraid_cmd *cmd)822{823	struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd;824	struct pmcraid_instance *pinstance = cmd->drv_inst;825	u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc);826 827	if (PMCRAID_IOASC_SENSE_KEY(ioasc) > 0) {828		scsi_cmd->result |= (DID_ERROR << 16);829		scmd_printk(KERN_INFO, scsi_cmd,830			    "command CDB[0] = %x failed with IOASC: 0x%08X\n",831			    cmd->ioa_cb->ioarcb.cdb[0], ioasc);832	}833 834	if (cmd->sense_buffer) {835		dma_unmap_single(&pinstance->pdev->dev, cmd->sense_buffer_dma,836				 SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);837		cmd->sense_buffer = NULL;838		cmd->sense_buffer_dma = 0;839	}840 841	scsi_dma_unmap(scsi_cmd);842	pmcraid_return_cmd(cmd);843	scsi_done(scsi_cmd);844}845 846/**847 * _pmcraid_fire_command - sends an IOA command to adapter848 *849 * This function adds the given block into pending command list850 * and returns without waiting851 *852 * @cmd : command to be sent to the device853 *854 * Return Value855 *	None856 */857static void _pmcraid_fire_command(struct pmcraid_cmd *cmd)858{859	struct pmcraid_instance *pinstance = cmd->drv_inst;860	unsigned long lock_flags;861 862	/* Add this command block to pending cmd pool. We do this prior to863	 * writting IOARCB to ioarrin because IOA might complete the command864	 * by the time we are about to add it to the list. Response handler865	 * (isr/tasklet) looks for cmd block in the pending pending list.866	 */867	spin_lock_irqsave(&pinstance->pending_pool_lock, lock_flags);868	list_add_tail(&cmd->free_list, &pinstance->pending_cmd_pool);869	spin_unlock_irqrestore(&pinstance->pending_pool_lock, lock_flags);870	atomic_inc(&pinstance->outstanding_cmds);871 872	/* driver writes lower 32-bit value of IOARCB address only */873	mb();874	iowrite32(le64_to_cpu(cmd->ioa_cb->ioarcb.ioarcb_bus_addr), pinstance->ioarrin);875}876 877/**878 * pmcraid_send_cmd - fires a command to IOA879 *880 * This function also sets up timeout function, and command completion881 * function882 *883 * @cmd: pointer to the command block to be fired to IOA884 * @cmd_done: command completion function, called once IOA responds885 * @timeout: timeout to wait for this command completion886 * @timeout_func: timeout handler887 *888 * Return value889 *   none890 */891static void pmcraid_send_cmd(892	struct pmcraid_cmd *cmd,893	void (*cmd_done) (struct pmcraid_cmd *),894	unsigned long timeout,895	void (*timeout_func) (struct timer_list *)896)897{898	/* initialize done function */899	cmd->cmd_done = cmd_done;900 901	if (timeout_func) {902		/* setup timeout handler */903		cmd->timer.expires = jiffies + timeout;904		cmd->timer.function = timeout_func;905		add_timer(&cmd->timer);906	}907 908	/* fire the command to IOA */909	_pmcraid_fire_command(cmd);910}911 912/**913 * pmcraid_ioa_shutdown_done - completion function for IOA shutdown command914 * @cmd: pointer to the command block used for sending IOA shutdown command915 *916 * Return value917 *  None918 */919static void pmcraid_ioa_shutdown_done(struct pmcraid_cmd *cmd)920{921	struct pmcraid_instance *pinstance = cmd->drv_inst;922	unsigned long lock_flags;923 924	spin_lock_irqsave(pinstance->host->host_lock, lock_flags);925	pmcraid_ioa_reset(cmd);926	spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);927}928 929/**930 * pmcraid_ioa_shutdown - sends SHUTDOWN command to ioa931 *932 * @cmd: pointer to the command block used as part of reset sequence933 *934 * Return Value935 *  None936 */937static void pmcraid_ioa_shutdown(struct pmcraid_cmd *cmd)938{939	pmcraid_info("response for Cancel CCN CDB[0] = %x ioasc = %x\n",940		     cmd->ioa_cb->ioarcb.cdb[0],941		     le32_to_cpu(cmd->ioa_cb->ioasa.ioasc));942 943	/* Note that commands sent during reset require next command to be sent944	 * to IOA. Hence reinit the done function as well as timeout function945	 */946	pmcraid_reinit_cmdblk(cmd);947	cmd->ioa_cb->ioarcb.request_type = REQ_TYPE_IOACMD;948	cmd->ioa_cb->ioarcb.resource_handle =949		cpu_to_le32(PMCRAID_IOA_RES_HANDLE);950	cmd->ioa_cb->ioarcb.cdb[0] = PMCRAID_IOA_SHUTDOWN;951	cmd->ioa_cb->ioarcb.cdb[1] = PMCRAID_SHUTDOWN_NORMAL;952 953	/* fire shutdown command to hardware. */954	pmcraid_info("firing normal shutdown command (%d) to IOA\n",955		     le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle));956 957	pmcraid_notify_ioastate(cmd->drv_inst, PMC_DEVICE_EVENT_SHUTDOWN_START);958 959	pmcraid_send_cmd(cmd, pmcraid_ioa_shutdown_done,960			 PMCRAID_SHUTDOWN_TIMEOUT,961			 pmcraid_timeout_handler);962}963 964static void pmcraid_querycfg(struct pmcraid_cmd *);965/**966 * pmcraid_get_fwversion_done - completion function for get_fwversion967 *968 * @cmd: pointer to command block used to send INQUIRY command969 *970 * Return Value971 *	none972 */973static void pmcraid_get_fwversion_done(struct pmcraid_cmd *cmd)974{975	struct pmcraid_instance *pinstance = cmd->drv_inst;976	u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc);977	unsigned long lock_flags;978 979	/* configuration table entry size depends on firmware version. If fw980	 * version is not known, it is not possible to interpret IOA config981	 * table982	 */983	if (ioasc) {984		pmcraid_err("IOA Inquiry failed with %x\n", ioasc);985		spin_lock_irqsave(pinstance->host->host_lock, lock_flags);986		pinstance->ioa_state = IOA_STATE_IN_RESET_ALERT;987		pmcraid_reset_alert(cmd);988		spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);989	} else  {990		pmcraid_querycfg(cmd);991	}992}993 994/**995 * pmcraid_get_fwversion - reads firmware version information996 *997 * @cmd: pointer to command block used to send INQUIRY command998 *999 * Return Value1000 *	none1001 */1002static void pmcraid_get_fwversion(struct pmcraid_cmd *cmd)1003{1004	struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb;1005	struct pmcraid_ioadl_desc *ioadl;1006	struct pmcraid_instance *pinstance = cmd->drv_inst;1007	u16 data_size = sizeof(struct pmcraid_inquiry_data);1008 1009	pmcraid_reinit_cmdblk(cmd);1010	ioarcb->request_type = REQ_TYPE_SCSI;1011	ioarcb->resource_handle = cpu_to_le32(PMCRAID_IOA_RES_HANDLE);1012	ioarcb->cdb[0] = INQUIRY;1013	ioarcb->cdb[1] = 1;1014	ioarcb->cdb[2] = 0xD0;1015	ioarcb->cdb[3] = (data_size >> 8) & 0xFF;1016	ioarcb->cdb[4] = data_size & 0xFF;1017 1018	/* Since entire inquiry data it can be part of IOARCB itself1019	 */1020	ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) +1021					offsetof(struct pmcraid_ioarcb,1022						add_data.u.ioadl[0]));1023	ioarcb->ioadl_length = cpu_to_le32(sizeof(struct pmcraid_ioadl_desc));1024	ioarcb->ioarcb_bus_addr &= cpu_to_le64(~(0x1FULL));1025 1026	ioarcb->request_flags0 |= NO_LINK_DESCS;1027	ioarcb->data_transfer_length = cpu_to_le32(data_size);1028	ioadl = &(ioarcb->add_data.u.ioadl[0]);1029	ioadl->flags = IOADL_FLAGS_LAST_DESC;1030	ioadl->address = cpu_to_le64(pinstance->inq_data_baddr);1031	ioadl->data_len = cpu_to_le32(data_size);1032 1033	pmcraid_send_cmd(cmd, pmcraid_get_fwversion_done,1034			 PMCRAID_INTERNAL_TIMEOUT, pmcraid_timeout_handler);1035}1036 1037/**1038 * pmcraid_identify_hrrq - registers host rrq buffers with IOA1039 * @cmd: pointer to command block to be used for identify hrrq1040 *1041 * Return Value1042 *	 none1043 */1044static void pmcraid_identify_hrrq(struct pmcraid_cmd *cmd)1045{1046	struct pmcraid_instance *pinstance = cmd->drv_inst;1047	struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb;1048	int index = cmd->hrrq_index;1049	__be64 hrrq_addr = cpu_to_be64(pinstance->hrrq_start_bus_addr[index]);1050	__be32 hrrq_size = cpu_to_be32(sizeof(u32) * PMCRAID_MAX_CMD);1051	void (*done_function)(struct pmcraid_cmd *);1052 1053	pmcraid_reinit_cmdblk(cmd);1054	cmd->hrrq_index = index + 1;1055 1056	if (cmd->hrrq_index < pinstance->num_hrrq) {1057		done_function = pmcraid_identify_hrrq;1058	} else {1059		cmd->hrrq_index = 0;1060		done_function = pmcraid_get_fwversion;1061	}1062 1063	/* Initialize ioarcb */1064	ioarcb->request_type = REQ_TYPE_IOACMD;1065	ioarcb->resource_handle = cpu_to_le32(PMCRAID_IOA_RES_HANDLE);1066 1067	/* initialize the hrrq number where IOA will respond to this command */1068	ioarcb->hrrq_id = index;1069	ioarcb->cdb[0] = PMCRAID_IDENTIFY_HRRQ;1070	ioarcb->cdb[1] = index;1071 1072	/* IOA expects 64-bit pci address to be written in B.E format1073	 * (i.e cdb[2]=MSByte..cdb[9]=LSB.1074	 */1075	pmcraid_info("HRRQ_IDENTIFY with hrrq:ioarcb:index => %llx:%llx:%x\n",1076		     hrrq_addr, ioarcb->ioarcb_bus_addr, index);1077 1078	memcpy(&(ioarcb->cdb[2]), &hrrq_addr, sizeof(hrrq_addr));1079	memcpy(&(ioarcb->cdb[10]), &hrrq_size, sizeof(hrrq_size));1080 1081	/* Subsequent commands require HRRQ identification to be successful.1082	 * Note that this gets called even during reset from SCSI mid-layer1083	 * or tasklet1084	 */1085	pmcraid_send_cmd(cmd, done_function,1086			 PMCRAID_INTERNAL_TIMEOUT,1087			 pmcraid_timeout_handler);1088}1089 1090static void pmcraid_process_ccn(struct pmcraid_cmd *cmd);1091static void pmcraid_process_ldn(struct pmcraid_cmd *cmd);1092 1093/**1094 * pmcraid_send_hcam_cmd - send an initialized command block(HCAM) to IOA1095 *1096 * @cmd: initialized command block pointer1097 *1098 * Return Value1099 *   none1100 */1101static void pmcraid_send_hcam_cmd(struct pmcraid_cmd *cmd)1102{1103	if (cmd->ioa_cb->ioarcb.cdb[1] == PMCRAID_HCAM_CODE_CONFIG_CHANGE)1104		atomic_set(&(cmd->drv_inst->ccn.ignore), 0);1105	else1106		atomic_set(&(cmd->drv_inst->ldn.ignore), 0);1107 1108	pmcraid_send_cmd(cmd, cmd->cmd_done, 0, NULL);1109}1110 1111/**1112 * pmcraid_init_hcam - send an initialized command block(HCAM) to IOA1113 *1114 * @pinstance: pointer to adapter instance structure1115 * @type: HCAM type1116 *1117 * Return Value1118 *   pointer to initialized pmcraid_cmd structure or NULL1119 */1120static struct pmcraid_cmd *pmcraid_init_hcam1121(1122	struct pmcraid_instance *pinstance,1123	u8 type1124)1125{1126	struct pmcraid_cmd *cmd;1127	struct pmcraid_ioarcb *ioarcb;1128	struct pmcraid_ioadl_desc *ioadl;1129	struct pmcraid_hostrcb *hcam;1130	void (*cmd_done) (struct pmcraid_cmd *);1131	dma_addr_t dma;1132	int rcb_size;1133 1134	cmd = pmcraid_get_free_cmd(pinstance);1135 1136	if (!cmd) {1137		pmcraid_err("no free command blocks for hcam\n");1138		return cmd;1139	}1140 1141	if (type == PMCRAID_HCAM_CODE_CONFIG_CHANGE) {1142		rcb_size = sizeof(struct pmcraid_hcam_ccn_ext);1143		cmd_done = pmcraid_process_ccn;1144		dma = pinstance->ccn.baddr + PMCRAID_AEN_HDR_SIZE;1145		hcam = &pinstance->ccn;1146	} else {1147		rcb_size = sizeof(struct pmcraid_hcam_ldn);1148		cmd_done = pmcraid_process_ldn;1149		dma = pinstance->ldn.baddr + PMCRAID_AEN_HDR_SIZE;1150		hcam = &pinstance->ldn;1151	}1152 1153	/* initialize command pointer used for HCAM registration */1154	hcam->cmd = cmd;1155 1156	ioarcb = &cmd->ioa_cb->ioarcb;1157	ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) +1158					offsetof(struct pmcraid_ioarcb,1159						add_data.u.ioadl[0]));1160	ioarcb->ioadl_length = cpu_to_le32(sizeof(struct pmcraid_ioadl_desc));1161	ioadl = ioarcb->add_data.u.ioadl;1162 1163	/* Initialize ioarcb */1164	ioarcb->request_type = REQ_TYPE_HCAM;1165	ioarcb->resource_handle = cpu_to_le32(PMCRAID_IOA_RES_HANDLE);1166	ioarcb->cdb[0] = PMCRAID_HOST_CONTROLLED_ASYNC;1167	ioarcb->cdb[1] = type;1168	ioarcb->cdb[7] = (rcb_size >> 8) & 0xFF;1169	ioarcb->cdb[8] = (rcb_size) & 0xFF;1170 1171	ioarcb->data_transfer_length = cpu_to_le32(rcb_size);1172 1173	ioadl[0].flags |= IOADL_FLAGS_READ_LAST;1174	ioadl[0].data_len = cpu_to_le32(rcb_size);1175	ioadl[0].address = cpu_to_le64(dma);1176 1177	cmd->cmd_done = cmd_done;1178	return cmd;1179}1180 1181/**1182 * pmcraid_send_hcam - Send an HCAM to IOA1183 * @pinstance: ioa config struct1184 * @type: HCAM type1185 *1186 * This function will send a Host Controlled Async command to IOA.1187 *1188 * Return value:1189 *	none1190 */1191static void pmcraid_send_hcam(struct pmcraid_instance *pinstance, u8 type)1192{1193	struct pmcraid_cmd *cmd = pmcraid_init_hcam(pinstance, type);1194	pmcraid_send_hcam_cmd(cmd);1195}1196 1197 1198/**1199 * pmcraid_prepare_cancel_cmd - prepares a command block to abort another1200 *1201 * @cmd: pointer to cmd that is used as cancelling command1202 * @cmd_to_cancel: pointer to the command that needs to be cancelled1203 */1204static void pmcraid_prepare_cancel_cmd(1205	struct pmcraid_cmd *cmd,1206	struct pmcraid_cmd *cmd_to_cancel1207)1208{1209	struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb;1210	__be64 ioarcb_addr;1211 1212	/* IOARCB address of the command to be cancelled is given in1213	 * cdb[2]..cdb[9] is Big-Endian format. Note that length bits in1214	 * IOARCB address are not masked.1215	 */1216	ioarcb_addr = cpu_to_be64(le64_to_cpu(cmd_to_cancel->ioa_cb->ioarcb.ioarcb_bus_addr));1217 1218	/* Get the resource handle to where the command to be aborted has been1219	 * sent.1220	 */1221	ioarcb->resource_handle = cmd_to_cancel->ioa_cb->ioarcb.resource_handle;1222	ioarcb->request_type = REQ_TYPE_IOACMD;1223	memset(ioarcb->cdb, 0, PMCRAID_MAX_CDB_LEN);1224	ioarcb->cdb[0] = PMCRAID_ABORT_CMD;1225 1226	memcpy(&(ioarcb->cdb[2]), &ioarcb_addr, sizeof(ioarcb_addr));1227}1228 1229/**1230 * pmcraid_cancel_hcam - sends ABORT task to abort a given HCAM1231 *1232 * @cmd: command to be used as cancelling command1233 * @type: HCAM type1234 * @cmd_done: op done function for the cancelling command1235 */1236static void pmcraid_cancel_hcam(1237	struct pmcraid_cmd *cmd,1238	u8 type,1239	void (*cmd_done) (struct pmcraid_cmd *)1240)1241{1242	struct pmcraid_instance *pinstance;1243	struct pmcraid_hostrcb  *hcam;1244 1245	pinstance = cmd->drv_inst;1246	hcam =  (type == PMCRAID_HCAM_CODE_LOG_DATA) ?1247		&pinstance->ldn : &pinstance->ccn;1248 1249	/* prepare for cancelling previous hcam command. If the HCAM is1250	 * currently not pending with IOA, we would have hcam->cmd as non-null1251	 */1252	if (hcam->cmd == NULL)1253		return;1254 1255	pmcraid_prepare_cancel_cmd(cmd, hcam->cmd);1256 1257	/* writing to IOARRIN must be protected by host_lock, as mid-layer1258	 * schedule queuecommand while we are doing this1259	 */1260	pmcraid_send_cmd(cmd, cmd_done,1261			 PMCRAID_INTERNAL_TIMEOUT,1262			 pmcraid_timeout_handler);1263}1264 1265/**1266 * pmcraid_cancel_ccn - cancel CCN HCAM already registered with IOA1267 *1268 * @cmd: command block to be used for cancelling the HCAM1269 */1270static void pmcraid_cancel_ccn(struct pmcraid_cmd *cmd)1271{1272	pmcraid_info("response for Cancel LDN CDB[0] = %x ioasc = %x\n",1273		     cmd->ioa_cb->ioarcb.cdb[0],1274		     le32_to_cpu(cmd->ioa_cb->ioasa.ioasc));1275 1276	pmcraid_reinit_cmdblk(cmd);1277 1278	pmcraid_cancel_hcam(cmd,1279			    PMCRAID_HCAM_CODE_CONFIG_CHANGE,1280			    pmcraid_ioa_shutdown);1281}1282 1283/**1284 * pmcraid_cancel_ldn - cancel LDN HCAM already registered with IOA1285 *1286 * @cmd: command block to be used for cancelling the HCAM1287 */1288static void pmcraid_cancel_ldn(struct pmcraid_cmd *cmd)1289{1290	pmcraid_cancel_hcam(cmd,1291			    PMCRAID_HCAM_CODE_LOG_DATA,1292			    pmcraid_cancel_ccn);1293}1294 1295/**1296 * pmcraid_expose_resource - check if the resource can be exposed to OS1297 *1298 * @fw_version: firmware version code1299 * @cfgte: pointer to configuration table entry of the resource1300 *1301 * Return value:1302 *	true if resource can be added to midlayer, false(0) otherwise1303 */1304static int pmcraid_expose_resource(u16 fw_version,1305				   struct pmcraid_config_table_entry *cfgte)1306{1307	int retval = 0;1308 1309	if (cfgte->resource_type == RES_TYPE_VSET) {1310		if (fw_version <= PMCRAID_FW_VERSION_1)1311			retval = ((cfgte->unique_flags1 & 0x80) == 0);1312		else1313			retval = ((cfgte->unique_flags0 & 0x80) == 0 &&1314				  (cfgte->unique_flags1 & 0x80) == 0);1315 1316	} else if (cfgte->resource_type == RES_TYPE_GSCSI)1317		retval = (RES_BUS(cfgte->resource_address) !=1318				PMCRAID_VIRTUAL_ENCL_BUS_ID);1319	return retval;1320}1321 1322/* attributes supported by pmcraid_event_family */1323enum {1324	PMCRAID_AEN_ATTR_UNSPEC,1325	PMCRAID_AEN_ATTR_EVENT,1326	__PMCRAID_AEN_ATTR_MAX,1327};1328#define PMCRAID_AEN_ATTR_MAX (__PMCRAID_AEN_ATTR_MAX - 1)1329 1330/* commands supported by pmcraid_event_family */1331enum {1332	PMCRAID_AEN_CMD_UNSPEC,1333	PMCRAID_AEN_CMD_EVENT,1334	__PMCRAID_AEN_CMD_MAX,1335};1336#define PMCRAID_AEN_CMD_MAX (__PMCRAID_AEN_CMD_MAX - 1)1337 1338static struct genl_multicast_group pmcraid_mcgrps[] = {1339	{ .name = "events", /* not really used - see ID discussion below */ },1340};1341 1342static struct genl_family pmcraid_event_family __ro_after_init = {1343	.module = THIS_MODULE,1344	.name = "pmcraid",1345	.version = 1,1346	.maxattr = PMCRAID_AEN_ATTR_MAX,1347	.mcgrps = pmcraid_mcgrps,1348	.n_mcgrps = ARRAY_SIZE(pmcraid_mcgrps),1349};1350 1351/**1352 * pmcraid_netlink_init - registers pmcraid_event_family1353 *1354 * Return value:1355 *	0 if the pmcraid_event_family is successfully registered1356 *	with netlink generic, non-zero otherwise1357 */1358static int __init pmcraid_netlink_init(void)1359{1360	int result;1361 1362	result = genl_register_family(&pmcraid_event_family);1363 1364	if (result)1365		return result;1366 1367	pmcraid_info("registered NETLINK GENERIC group: %d\n",1368		     pmcraid_event_family.id);1369 1370	return result;1371}1372 1373/**1374 * pmcraid_netlink_release - unregisters pmcraid_event_family1375 *1376 * Return value:1377 *	none1378 */1379static void pmcraid_netlink_release(void)1380{1381	genl_unregister_family(&pmcraid_event_family);1382}1383 1384/*1385 * pmcraid_notify_aen - sends event msg to user space application1386 * @pinstance: pointer to adapter instance structure1387 *1388 * Return value:1389 *	0 if success, error value in case of any failure.1390 */1391static int pmcraid_notify_aen(1392	struct pmcraid_instance *pinstance,1393	struct pmcraid_aen_msg  *aen_msg,1394	u32    data_size)1395{1396	struct sk_buff *skb;1397	void *msg_header;1398	u32  total_size, nla_genl_hdr_total_size;1399	int result;1400 1401	aen_msg->hostno = (pinstance->host->unique_id << 16 |1402			   MINOR(pinstance->cdev.dev));1403	aen_msg->length = data_size;1404 1405	data_size += sizeof(*aen_msg);1406 1407	total_size = nla_total_size(data_size);1408	/* Add GENL_HDR to total_size */1409	nla_genl_hdr_total_size =1410		(total_size + (GENL_HDRLEN +1411		((struct genl_family *)&pmcraid_event_family)->hdrsize)1412		 + NLMSG_HDRLEN);1413	skb = genlmsg_new(nla_genl_hdr_total_size, GFP_ATOMIC);1414 1415 1416	if (!skb) {1417		pmcraid_err("Failed to allocate aen data SKB of size: %x\n",1418			     total_size);1419		return -ENOMEM;1420	}1421 1422	/* add the genetlink message header */1423	msg_header = genlmsg_put(skb, 0, 0,1424				 &pmcraid_event_family, 0,1425				 PMCRAID_AEN_CMD_EVENT);1426	if (!msg_header) {1427		pmcraid_err("failed to copy command details\n");1428		nlmsg_free(skb);1429		return -ENOMEM;1430	}1431 1432	result = nla_put(skb, PMCRAID_AEN_ATTR_EVENT, data_size, aen_msg);1433 1434	if (result) {1435		pmcraid_err("failed to copy AEN attribute data\n");1436		nlmsg_free(skb);1437		return -EINVAL;1438	}1439 1440	/* send genetlink multicast message to notify applications */1441	genlmsg_end(skb, msg_header);1442 1443	result = genlmsg_multicast(&pmcraid_event_family, skb,1444				   0, 0, GFP_ATOMIC);1445 1446	/* If there are no listeners, genlmsg_multicast may return non-zero1447	 * value.1448	 */1449	if (result)1450		pmcraid_info("error (%x) sending aen event message\n", result);1451	return result;1452}1453 1454/**1455 * pmcraid_notify_ccn - notifies about CCN event msg to user space1456 * @pinstance: pointer adapter instance structure1457 *1458 * Return value:1459 *	0 if success, error value in case of any failure1460 */1461static int pmcraid_notify_ccn(struct pmcraid_instance *pinstance)1462{1463	return pmcraid_notify_aen(pinstance,1464				pinstance->ccn.msg,1465				le32_to_cpu(pinstance->ccn.hcam->data_len) +1466				sizeof(struct pmcraid_hcam_hdr));1467}1468 1469/**1470 * pmcraid_notify_ldn - notifies about CCN event msg to user space1471 * @pinstance: pointer adapter instance structure1472 *1473 * Return value:1474 *	0 if success, error value in case of any failure1475 */1476static int pmcraid_notify_ldn(struct pmcraid_instance *pinstance)1477{1478	return pmcraid_notify_aen(pinstance,1479				pinstance->ldn.msg,1480				le32_to_cpu(pinstance->ldn.hcam->data_len) +1481				sizeof(struct pmcraid_hcam_hdr));1482}1483 1484/**1485 * pmcraid_notify_ioastate - sends IOA state event msg to user space1486 * @pinstance: pointer adapter instance structure1487 * @evt: controller state event to be sent1488 *1489 * Return value:1490 *	0 if success, error value in case of any failure1491 */1492static void pmcraid_notify_ioastate(struct pmcraid_instance *pinstance, u32 evt)1493{1494	pinstance->scn.ioa_state = evt;1495	pmcraid_notify_aen(pinstance,1496			  &pinstance->scn.msg,1497			  sizeof(u32));1498}1499 1500/**1501 * pmcraid_handle_config_change - Handle a config change from the adapter1502 * @pinstance: pointer to per adapter instance structure1503 *1504 * Return value:1505 *  none1506 */1507 1508static void pmcraid_handle_config_change(struct pmcraid_instance *pinstance)1509{1510	struct pmcraid_config_table_entry *cfg_entry;1511	struct pmcraid_hcam_ccn *ccn_hcam;1512	struct pmcraid_cmd *cmd;1513	struct pmcraid_cmd *cfgcmd;1514	struct pmcraid_resource_entry *res = NULL;1515	unsigned long lock_flags;1516	unsigned long host_lock_flags;1517	u32 new_entry = 1;1518	u32 hidden_entry = 0;1519	u16 fw_version;1520	int rc;1521 1522	ccn_hcam = (struct pmcraid_hcam_ccn *)pinstance->ccn.hcam;1523	cfg_entry = &ccn_hcam->cfg_entry;1524	fw_version = be16_to_cpu(pinstance->inq_data->fw_version);1525 1526	pmcraid_info("CCN(%x): %x timestamp: %llx type: %x lost: %x flags: %x \1527		 res: %x:%x:%x:%x\n",1528		 le32_to_cpu(pinstance->ccn.hcam->ilid),1529		 pinstance->ccn.hcam->op_code,1530		(le32_to_cpu(pinstance->ccn.hcam->timestamp1) |1531		((le32_to_cpu(pinstance->ccn.hcam->timestamp2) & 0xffffffffLL) << 32)),1532		 pinstance->ccn.hcam->notification_type,1533		 pinstance->ccn.hcam->notification_lost,1534		 pinstance->ccn.hcam->flags,1535		 pinstance->host->unique_id,1536		 RES_IS_VSET(*cfg_entry) ? PMCRAID_VSET_BUS_ID :1537		 (RES_IS_GSCSI(*cfg_entry) ? PMCRAID_PHYS_BUS_ID :1538			RES_BUS(cfg_entry->resource_address)),1539		 RES_IS_VSET(*cfg_entry) ?1540			(fw_version <= PMCRAID_FW_VERSION_1 ?1541				cfg_entry->unique_flags1 :1542				le16_to_cpu(cfg_entry->array_id) & 0xFF) :1543			RES_TARGET(cfg_entry->resource_address),1544		 RES_LUN(cfg_entry->resource_address));1545 1546 1547	/* If this HCAM indicates a lost notification, read the config table */1548	if (pinstance->ccn.hcam->notification_lost) {1549		cfgcmd = pmcraid_get_free_cmd(pinstance);1550		if (cfgcmd) {1551			pmcraid_info("lost CCN, reading config table\b");1552			pinstance->reinit_cfg_table = 1;1553			pmcraid_querycfg(cfgcmd);1554		} else {1555			pmcraid_err("lost CCN, no free cmd for querycfg\n");1556		}1557		goto out_notify_apps;1558	}1559 1560	/* If this resource is not going to be added to mid-layer, just notify1561	 * applications and return. If this notification is about hiding a VSET1562	 * resource, check if it was exposed already.1563	 */1564	if (pinstance->ccn.hcam->notification_type ==1565	    NOTIFICATION_TYPE_ENTRY_CHANGED &&1566	    cfg_entry->resource_type == RES_TYPE_VSET) {1567		hidden_entry = (cfg_entry->unique_flags1 & 0x80) != 0;1568	} else if (!pmcraid_expose_resource(fw_version, cfg_entry)) {1569		goto out_notify_apps;1570	}1571 1572	spin_lock_irqsave(&pinstance->resource_lock, lock_flags);1573	list_for_each_entry(res, &pinstance->used_res_q, queue) {1574		rc = memcmp(&res->cfg_entry.resource_address,1575			    &cfg_entry->resource_address,1576			    sizeof(cfg_entry->resource_address));1577		if (!rc) {1578			new_entry = 0;1579			break;1580		}1581	}1582 1583	if (new_entry) {1584 1585		if (hidden_entry) {1586			spin_unlock_irqrestore(&pinstance->resource_lock,1587						lock_flags);1588			goto out_notify_apps;1589		}1590 1591		/* If there are more number of resources than what driver can1592		 * manage, do not notify the applications about the CCN. Just1593		 * ignore this notifications and re-register the same HCAM1594		 */1595		if (list_empty(&pinstance->free_res_q)) {1596			spin_unlock_irqrestore(&pinstance->resource_lock,1597						lock_flags);1598			pmcraid_err("too many resources attached\n");1599			spin_lock_irqsave(pinstance->host->host_lock,1600					  host_lock_flags);1601			pmcraid_send_hcam(pinstance,1602					  PMCRAID_HCAM_CODE_CONFIG_CHANGE);1603			spin_unlock_irqrestore(pinstance->host->host_lock,1604					       host_lock_flags);1605			return;1606		}1607 1608		res = list_entry(pinstance->free_res_q.next,1609				 struct pmcraid_resource_entry, queue);1610 1611		list_del(&res->queue);1612		res->scsi_dev = NULL;1613		res->reset_progress = 0;1614		list_add_tail(&res->queue, &pinstance->used_res_q);1615	}1616 1617	memcpy(&res->cfg_entry, cfg_entry, pinstance->config_table_entry_size);1618 1619	if (pinstance->ccn.hcam->notification_type ==1620	    NOTIFICATION_TYPE_ENTRY_DELETED || hidden_entry) {1621		if (res->scsi_dev) {1622			if (fw_version <= PMCRAID_FW_VERSION_1)1623				res->cfg_entry.unique_flags1 &= 0x7F;1624			else1625				res->cfg_entry.array_id &= cpu_to_le16(0xFF);1626			res->change_detected = RES_CHANGE_DEL;1627			res->cfg_entry.resource_handle =1628				PMCRAID_INVALID_RES_HANDLE;1629			schedule_work(&pinstance->worker_q);1630		} else {1631			/* This may be one of the non-exposed resources */1632			list_move_tail(&res->queue, &pinstance->free_res_q);1633		}1634	} else if (!res->scsi_dev) {1635		res->change_detected = RES_CHANGE_ADD;1636		schedule_work(&pinstance->worker_q);1637	}1638	spin_unlock_irqrestore(&pinstance->resource_lock, lock_flags);1639 1640out_notify_apps:1641 1642	/* Notify configuration changes to registered applications.*/1643	if (!pmcraid_disable_aen)1644		pmcraid_notify_ccn(pinstance);1645 1646	cmd = pmcraid_init_hcam(pinstance, PMCRAID_HCAM_CODE_CONFIG_CHANGE);1647	if (cmd)1648		pmcraid_send_hcam_cmd(cmd);1649}1650 1651/**1652 * pmcraid_get_error_info - return error string for an ioasc1653 * @ioasc: ioasc code1654 * Return Value1655 *	 none1656 */1657static struct pmcraid_ioasc_error *pmcraid_get_error_info(u32 ioasc)1658{1659	int i;1660	for (i = 0; i < ARRAY_SIZE(pmcraid_ioasc_error_table); i++) {1661		if (pmcraid_ioasc_error_table[i].ioasc_code == ioasc)1662			return &pmcraid_ioasc_error_table[i];1663	}1664	return NULL;1665}1666 1667/**1668 * pmcraid_ioasc_logger - log IOASC information based user-settings1669 * @ioasc: ioasc code1670 * @cmd: pointer to command that resulted in 'ioasc'1671 */1672static void pmcraid_ioasc_logger(u32 ioasc, struct pmcraid_cmd *cmd)1673{1674	struct pmcraid_ioasc_error *error_info = pmcraid_get_error_info(ioasc);1675 1676	if (error_info == NULL ||1677		cmd->drv_inst->current_log_level < error_info->log_level)1678		return;1679 1680	/* log the error string */1681	pmcraid_err("cmd [%x] for resource %x failed with %x(%s)\n",1682		cmd->ioa_cb->ioarcb.cdb[0],1683		le32_to_cpu(cmd->ioa_cb->ioarcb.resource_handle),1684		ioasc, error_info->error_string);1685}1686 1687/**1688 * pmcraid_handle_error_log - Handle a config change (error log) from the IOA1689 *1690 * @pinstance: pointer to per adapter instance structure1691 *1692 * Return value:1693 *  none1694 */1695static void pmcraid_handle_error_log(struct pmcraid_instance *pinstance)1696{1697	struct pmcraid_hcam_ldn *hcam_ldn;1698	u32 ioasc;1699 1700	hcam_ldn = (struct pmcraid_hcam_ldn *)pinstance->ldn.hcam;1701 1702	pmcraid_info1703		("LDN(%x): %x type: %x lost: %x flags: %x overlay id: %x\n",1704		 pinstance->ldn.hcam->ilid,1705		 pinstance->ldn.hcam->op_code,1706		 pinstance->ldn.hcam->notification_type,1707		 pinstance->ldn.hcam->notification_lost,1708		 pinstance->ldn.hcam->flags,1709		 pinstance->ldn.hcam->overlay_id);1710 1711	/* log only the errors, no need to log informational log entries */1712	if (pinstance->ldn.hcam->notification_type !=1713	    NOTIFICATION_TYPE_ERROR_LOG)1714		return;1715 1716	if (pinstance->ldn.hcam->notification_lost ==1717	    HOSTRCB_NOTIFICATIONS_LOST)1718		dev_info(&pinstance->pdev->dev, "Error notifications lost\n");1719 1720	ioasc = le32_to_cpu(hcam_ldn->error_log.fd_ioasc);1721 1722	if (ioasc == PMCRAID_IOASC_UA_BUS_WAS_RESET ||1723		ioasc == PMCRAID_IOASC_UA_BUS_WAS_RESET_BY_OTHER) {1724		dev_info(&pinstance->pdev->dev,1725			"UnitAttention due to IOA Bus Reset\n");1726		scsi_report_bus_reset(1727			pinstance->host,1728			RES_BUS(hcam_ldn->error_log.fd_ra));1729	}1730 1731	return;1732}1733 1734/**1735 * pmcraid_process_ccn - Op done function for a CCN.1736 * @cmd: pointer to command struct1737 *1738 * This function is the op done function for a configuration1739 * change notification1740 *1741 * Return value:1742 * none1743 */1744static void pmcraid_process_ccn(struct pmcraid_cmd *cmd)1745{1746	struct pmcraid_instance *pinstance = cmd->drv_inst;1747	u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc);1748	unsigned long lock_flags;1749 1750	pinstance->ccn.cmd = NULL;1751	pmcraid_return_cmd(cmd);1752 1753	/* If driver initiated IOA reset happened while this hcam was pending1754	 * with IOA, or IOA bringdown sequence is in progress, no need to1755	 * re-register the hcam1756	 */1757	if (ioasc == PMCRAID_IOASC_IOA_WAS_RESET ||1758	    atomic_read(&pinstance->ccn.ignore) == 1) {1759		return;1760	} else if (ioasc) {1761		dev_info(&pinstance->pdev->dev,1762			"Host RCB (CCN) failed with IOASC: 0x%08X\n", ioasc);1763		spin_lock_irqsave(pinstance->host->host_lock, lock_flags);1764		pmcraid_send_hcam(pinstance, PMCRAID_HCAM_CODE_CONFIG_CHANGE);1765		spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);1766	} else {1767		pmcraid_handle_config_change(pinstance);1768	}1769}1770 1771static void pmcraid_initiate_reset(struct pmcraid_instance *);1772static void pmcraid_set_timestamp(struct pmcraid_cmd *cmd);1773/**1774 * pmcraid_process_ldn - op done function for an LDN1775 * @cmd: pointer to command block1776 *1777 * Return value1778 *   none1779 */1780static void pmcraid_process_ldn(struct pmcraid_cmd *cmd)1781{1782	struct pmcraid_instance *pinstance = cmd->drv_inst;1783	struct pmcraid_hcam_ldn *ldn_hcam =1784			(struct pmcraid_hcam_ldn *)pinstance->ldn.hcam;1785	u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc);1786	u32 fd_ioasc = le32_to_cpu(ldn_hcam->error_log.fd_ioasc);1787	unsigned long lock_flags;1788 1789	/* return the command block back to freepool */1790	pinstance->ldn.cmd = NULL;1791	pmcraid_return_cmd(cmd);1792 1793	/* If driver initiated IOA reset happened while this hcam was pending1794	 * with IOA, no need to re-register the hcam as reset engine will do it1795	 * once reset sequence is complete1796	 */1797	if (ioasc == PMCRAID_IOASC_IOA_WAS_RESET ||1798	    atomic_read(&pinstance->ccn.ignore) == 1) {1799		return;1800	} else if (!ioasc) {1801		pmcraid_handle_error_log(pinstance);1802		if (fd_ioasc == PMCRAID_IOASC_NR_IOA_RESET_REQUIRED) {1803			spin_lock_irqsave(pinstance->host->host_lock,1804					  lock_flags);1805			pmcraid_initiate_reset(pinstance);1806			spin_unlock_irqrestore(pinstance->host->host_lock,1807					       lock_flags);1808			return;1809		}1810		if (fd_ioasc == PMCRAID_IOASC_TIME_STAMP_OUT_OF_SYNC) {1811			pinstance->timestamp_error = 1;1812			pmcraid_set_timestamp(cmd);1813		}1814	} else {1815		dev_info(&pinstance->pdev->dev,1816			"Host RCB(LDN) failed with IOASC: 0x%08X\n", ioasc);1817	}1818	/* send netlink message for HCAM notification if enabled */1819	if (!pmcraid_disable_aen)1820		pmcraid_notify_ldn(pinstance);1821 1822	cmd = pmcraid_init_hcam(pinstance, PMCRAID_HCAM_CODE_LOG_DATA);1823	if (cmd)1824		pmcraid_send_hcam_cmd(cmd);1825}1826 1827/**1828 * pmcraid_register_hcams - register HCAMs for CCN and LDN1829 *1830 * @pinstance: pointer per adapter instance structure1831 *1832 * Return Value1833 *   none1834 */1835static void pmcraid_register_hcams(struct pmcraid_instance *pinstance)1836{1837	pmcraid_send_hcam(pinstance, PMCRAID_HCAM_CODE_CONFIG_CHANGE);1838	pmcraid_send_hcam(pinstance, PMCRAID_HCAM_CODE_LOG_DATA);1839}1840 1841/**1842 * pmcraid_unregister_hcams - cancel HCAMs registered already1843 * @cmd: pointer to command used as part of reset sequence1844 */1845static void pmcraid_unregister_hcams(struct pmcraid_cmd *cmd)1846{1847	struct pmcraid_instance *pinstance = cmd->drv_inst;1848 1849	/* During IOA bringdown, HCAM gets fired and tasklet proceeds with1850	 * handling hcam response though it is not necessary. In order to1851	 * prevent this, set 'ignore', so that bring-down sequence doesn't1852	 * re-send any more hcams1853	 */1854	atomic_set(&pinstance->ccn.ignore, 1);1855	atomic_set(&pinstance->ldn.ignore, 1);1856 1857	/* If adapter reset was forced as part of runtime reset sequence,1858	 * start the reset sequence. Reset will be triggered even in case1859	 * IOA unit_check.1860	 */1861	if ((pinstance->force_ioa_reset && !pinstance->ioa_bringdown) ||1862	     pinstance->ioa_unit_check) {1863		pinstance->force_ioa_reset = 0;1864		pinstance->ioa_unit_check = 0;1865		pinstance->ioa_state = IOA_STATE_IN_RESET_ALERT;1866		pmcraid_reset_alert(cmd);1867		return;1868	}1869 1870	/* Driver tries to cancel HCAMs by sending ABORT TASK for each HCAM1871	 * one after the other. So CCN cancellation will be triggered by1872	 * pmcraid_cancel_ldn itself.1873	 */1874	pmcraid_cancel_ldn(cmd);1875}1876 1877static void pmcraid_reinit_buffers(struct pmcraid_instance *);1878 1879/**1880 * pmcraid_reset_enable_ioa - re-enable IOA after a hard reset1881 * @pinstance: pointer to adapter instance structure1882 * Return Value1883 *  1 if TRANSITION_TO_OPERATIONAL is active, otherwise 01884 */1885static int pmcraid_reset_enable_ioa(struct pmcraid_instance *pinstance)1886{1887	u32 intrs;1888 1889	pmcraid_reinit_buffers(pinstance);1890	intrs = pmcraid_read_interrupts(pinstance);1891 1892	pmcraid_enable_interrupts(pinstance, PMCRAID_PCI_INTERRUPTS);1893 1894	if (intrs & INTRS_TRANSITION_TO_OPERATIONAL) {1895		if (!pinstance->interrupt_mode) {1896			iowrite32(INTRS_TRANSITION_TO_OPERATIONAL,1897				pinstance->int_regs.1898				ioa_host_interrupt_mask_reg);1899			iowrite32(INTRS_TRANSITION_TO_OPERATIONAL,1900				pinstance->int_regs.ioa_host_interrupt_clr_reg);1901		}1902		return 1;1903	} else {1904		return 0;1905	}1906}1907 1908/**1909 * pmcraid_soft_reset - performs a soft reset and makes IOA become ready1910 * @cmd : pointer to reset command block1911 *1912 * Return Value1913 *	none1914 */1915static void pmcraid_soft_reset(struct pmcraid_cmd *cmd)1916{1917	struct pmcraid_instance *pinstance = cmd->drv_inst;1918	u32 int_reg;1919	u32 doorbell;1920 1921	/* There will be an interrupt when Transition to Operational bit is1922	 * set so tasklet would execute next reset task. The timeout handler1923	 * would re-initiate a reset1924	 */1925	cmd->cmd_done = pmcraid_ioa_reset;1926	cmd->timer.expires = jiffies +1927			     msecs_to_jiffies(PMCRAID_TRANSOP_TIMEOUT);1928	cmd->timer.function = pmcraid_timeout_handler;1929 1930	if (!timer_pending(&cmd->timer))1931		add_timer(&cmd->timer);1932 1933	/* Enable destructive diagnostics on IOA if it is not yet in1934	 * operational state1935	 */1936	doorbell = DOORBELL_RUNTIME_RESET |1937		   DOORBELL_ENABLE_DESTRUCTIVE_DIAGS;1938 1939	/* Since we do RESET_ALERT and Start BIST we have to again write1940	 * MSIX Doorbell to indicate the interrupt mode1941	 */1942	if (pinstance->interrupt_mode) {1943		iowrite32(DOORBELL_INTR_MODE_MSIX,1944			  pinstance->int_regs.host_ioa_interrupt_reg);1945		ioread32(pinstance->int_regs.host_ioa_interrupt_reg);1946	}1947 1948	iowrite32(doorbell, pinstance->int_regs.host_ioa_interrupt_reg);1949	ioread32(pinstance->int_regs.host_ioa_interrupt_reg);1950	int_reg = ioread32(pinstance->int_regs.ioa_host_interrupt_reg);1951 1952	pmcraid_info("Waiting for IOA to become operational %x:%x\n",1953		     ioread32(pinstance->int_regs.host_ioa_interrupt_reg),1954		     int_reg);1955}1956 1957/**1958 * pmcraid_get_dump - retrieves IOA dump in case of Unit Check interrupt1959 *1960 * @pinstance: pointer to adapter instance structure1961 *1962 * Return Value1963 *	none1964 */1965static void pmcraid_get_dump(struct pmcraid_instance *pinstance)1966{1967	pmcraid_info("%s is not yet implemented\n", __func__);1968}1969 1970/**1971 * pmcraid_fail_outstanding_cmds - Fails all outstanding ops.1972 * @pinstance: pointer to adapter instance structure1973 *1974 * This function fails all outstanding ops. If they are submitted to IOA1975 * already, it sends cancel all messages if IOA is still accepting IOARCBs,1976 * otherwise just completes the commands and returns the cmd blocks to free1977 * pool.1978 *1979 * Return value:1980 *	 none1981 */1982static void pmcraid_fail_outstanding_cmds(struct pmcraid_instance *pinstance)1983{1984	struct pmcraid_cmd *cmd, *temp;1985	unsigned long lock_flags;1986 1987	/* pending command list is protected by pending_pool_lock. Its1988	 * traversal must be done as within this lock1989	 */1990	spin_lock_irqsave(&pinstance->pending_pool_lock, lock_flags);1991	list_for_each_entry_safe(cmd, temp, &pinstance->pending_cmd_pool,1992				 free_list) {1993		list_del(&cmd->free_list);1994		spin_unlock_irqrestore(&pinstance->pending_pool_lock,1995					lock_flags);1996		cmd->ioa_cb->ioasa.ioasc =1997			cpu_to_le32(PMCRAID_IOASC_IOA_WAS_RESET);1998		cmd->ioa_cb->ioasa.ilid =1999			cpu_to_le32(PMCRAID_DRIVER_ILID);2000 2001		/* In case the command timer is still running */2002		del_timer(&cmd->timer);2003 2004		/* If this is an IO command, complete it by invoking scsi_done2005		 * function. If this is one of the internal commands other2006		 * than pmcraid_ioa_reset and HCAM commands invoke cmd_done to2007		 * complete it2008		 */2009		if (cmd->scsi_cmd) {2010 2011			struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd;2012			__le32 resp = cmd->ioa_cb->ioarcb.response_handle;2013 2014			scsi_cmd->result |= DID_ERROR << 16;2015 2016			scsi_dma_unmap(scsi_cmd);2017			pmcraid_return_cmd(cmd);2018 2019			pmcraid_info("failing(%d) CDB[0] = %x result: %x\n",2020				     le32_to_cpu(resp) >> 2,2021				     cmd->ioa_cb->ioarcb.cdb[0],2022				     scsi_cmd->result);2023			scsi_done(scsi_cmd);2024		} else if (cmd->cmd_done == pmcraid_internal_done ||2025			   cmd->cmd_done == pmcraid_erp_done) {2026			cmd->cmd_done(cmd);2027		} else if (cmd->cmd_done != pmcraid_ioa_reset &&2028			   cmd->cmd_done != pmcraid_ioa_shutdown_done) {2029			pmcraid_return_cmd(cmd);2030		}2031 2032		atomic_dec(&pinstance->outstanding_cmds);2033		spin_lock_irqsave(&pinstance->pending_pool_lock, lock_flags);2034	}2035 2036	spin_unlock_irqrestore(&pinstance->pending_pool_lock, lock_flags);2037}2038 2039/**2040 * pmcraid_ioa_reset - Implementation of IOA reset logic2041 *2042 * @cmd: pointer to the cmd block to be used for entire reset process2043 *2044 * This function executes most of the steps required for IOA reset. This gets2045 * called by user threads (modprobe/insmod/rmmod) timer, tasklet and midlayer's2046 * 'eh_' thread. Access to variables used for controlling the reset sequence is2047 * synchronized using host lock. Various functions called during reset process2048 * would make use of a single command block, pointer to which is also stored in2049 * adapter instance structure.2050 *2051 * Return Value2052 *	 None2053 */2054static void pmcraid_ioa_reset(struct pmcraid_cmd *cmd)2055{2056	struct pmcraid_instance *pinstance = cmd->drv_inst;2057	u8 reset_complete = 0;2058 2059	pinstance->ioa_reset_in_progress = 1;2060 2061	if (pinstance->reset_cmd != cmd) {2062		pmcraid_err("reset is called with different command block\n");2063		pinstance->reset_cmd = cmd;2064	}2065 2066	pmcraid_info("reset_engine: state = %d, command = %p\n",2067		      pinstance->ioa_state, cmd);2068 2069	switch (pinstance->ioa_state) {2070 2071	case IOA_STATE_DEAD:2072		/* If IOA is offline, whatever may be the reset reason, just2073		 * return. callers might be waiting on the reset wait_q, wake2074		 * up them2075		 */2076		pmcraid_err("IOA is offline no reset is possible\n");2077		reset_complete = 1;2078		break;2079 2080	case IOA_STATE_IN_BRINGDOWN:2081		/* we enter here, once ioa shutdown command is processed by IOA2082		 * Alert IOA for a possible reset. If reset alert fails, IOA2083		 * goes through hard-reset2084		 */2085		pmcraid_disable_interrupts(pinstance, ~0);2086		pinstance->ioa_state = IOA_STATE_IN_RESET_ALERT;2087		pmcraid_reset_alert(cmd);2088		break;2089 2090	case IOA_STATE_UNKNOWN:2091		/* We may be called during probe or resume. Some pre-processing2092		 * is required for prior to reset2093		 */2094		scsi_block_requests(pinstance->host);2095 2096		/* If asked to reset while IOA was processing responses or2097		 * there are any error responses then IOA may require2098		 * hard-reset.2099		 */2100		if (pinstance->ioa_hard_reset == 0) {2101			if (ioread32(pinstance->ioa_status) &2102			    INTRS_TRANSITION_TO_OPERATIONAL) {2103				pmcraid_info("sticky bit set, bring-up\n");2104				pinstance->ioa_state = IOA_STATE_IN_BRINGUP;2105				pmcraid_reinit_cmdblk(cmd);2106				pmcraid_identify_hrrq(cmd);2107			} else {2108				pinstance->ioa_state = IOA_STATE_IN_SOFT_RESET;2109				pmcraid_soft_reset(cmd);2110			}2111		} else {2112			/* Alert IOA of a possible reset and wait for critical2113			 * operation in progress bit to reset2114			 */2115			pinstance->ioa_state = IOA_STATE_IN_RESET_ALERT;2116			pmcraid_reset_alert(cmd);2117		}2118		break;2119 2120	case IOA_STATE_IN_RESET_ALERT:2121		/* If critical operation in progress bit is reset or wait gets2122		 * timed out, reset proceeds with starting BIST on the IOA.2123		 * pmcraid_ioa_hard_reset keeps a count of reset attempts. If2124		 * they are 3 or more, reset engine marks IOA dead and returns2125		 */2126		pinstance->ioa_state = IOA_STATE_IN_HARD_RESET;2127		pmcraid_start_bist(cmd);2128		break;2129 2130	case IOA_STATE_IN_HARD_RESET:2131		pinstance->ioa_reset_attempts++;2132 2133		/* retry reset if we haven't reached maximum allowed limit */2134		if (pinstance->ioa_reset_attempts > PMCRAID_RESET_ATTEMPTS) {2135			pinstance->ioa_reset_attempts = 0;2136			pmcraid_err("IOA didn't respond marking it as dead\n");2137			pinstance->ioa_state = IOA_STATE_DEAD;2138 2139			if (pinstance->ioa_bringdown)2140				pmcraid_notify_ioastate(pinstance,2141					PMC_DEVICE_EVENT_SHUTDOWN_FAILED);2142			else2143				pmcraid_notify_ioastate(pinstance,2144						PMC_DEVICE_EVENT_RESET_FAILED);2145			reset_complete = 1;2146			break;2147		}2148 2149		/* Once either bist or pci reset is done, restore PCI config2150		 * space. If this fails, proceed with hard reset again2151		 */2152		pci_restore_state(pinstance->pdev);2153 2154		/* fail all pending commands */2155		pmcraid_fail_outstanding_cmds(pinstance);2156 2157		/* check if unit check is active, if so extract dump */2158		if (pinstance->ioa_unit_check) {2159			pmcraid_info("unit check is active\n");2160			pinstance->ioa_unit_check = 0;2161			pmcraid_get_dump(pinstance);2162			pinstance->ioa_reset_attempts--;2163			pinstance->ioa_state = IOA_STATE_IN_RESET_ALERT;2164			pmcraid_reset_alert(cmd);2165			break;2166		}2167 2168		/* if the reset reason is to bring-down the ioa, we might be2169		 * done with the reset restore pci_config_space and complete2170		 * the reset2171		 */2172		if (pinstance->ioa_bringdown) {2173			pmcraid_info("bringing down the adapter\n");2174			pinstance->ioa_shutdown_type = SHUTDOWN_NONE;2175			pinstance->ioa_bringdown = 0;2176			pinstance->ioa_state = IOA_STATE_UNKNOWN;2177			pmcraid_notify_ioastate(pinstance,2178					PMC_DEVICE_EVENT_SHUTDOWN_SUCCESS);2179			reset_complete = 1;2180		} else {2181			/* bring-up IOA, so proceed with soft reset2182			 * Reinitialize hrrq_buffers and their indices also2183			 * enable interrupts after a pci_restore_state2184			 */2185			if (pmcraid_reset_enable_ioa(pinstance)) {2186				pinstance->ioa_state = IOA_STATE_IN_BRINGUP;2187				pmcraid_info("bringing up the adapter\n");2188				pmcraid_reinit_cmdblk(cmd);2189				pmcraid_identify_hrrq(cmd);2190			} else {2191				pinstance->ioa_state = IOA_STATE_IN_SOFT_RESET;2192				pmcraid_soft_reset(cmd);2193			}2194		}2195		break;2196 2197	case IOA_STATE_IN_SOFT_RESET:2198		/* TRANSITION TO OPERATIONAL is on so start initialization2199		 * sequence2200		 */2201		pmcraid_info("In softreset proceeding with bring-up\n");2202		pinstance->ioa_state = IOA_STATE_IN_BRINGUP;2203 2204		/* Initialization commands start with HRRQ identification. From2205		 * now on tasklet completes most of the commands as IOA is up2206		 * and intrs are enabled2207		 */2208		pmcraid_identify_hrrq(cmd);2209		break;2210 2211	case IOA_STATE_IN_BRINGUP:2212		/* we are done with bringing up of IOA, change the ioa_state to2213		 * operational and wake up any waiters2214		 */2215		pinstance->ioa_state = IOA_STATE_OPERATIONAL;2216		reset_complete = 1;2217		break;2218 2219	case IOA_STATE_OPERATIONAL:2220	default:2221		/* When IOA is operational and a reset is requested, check for2222		 * the reset reason. If reset is to bring down IOA, unregister2223		 * HCAMs and initiate shutdown; if adapter reset is forced then2224		 * restart reset sequence again2225		 */2226		if (pinstance->ioa_shutdown_type == SHUTDOWN_NONE &&2227		    pinstance->force_ioa_reset == 0) {2228			pmcraid_notify_ioastate(pinstance,2229						PMC_DEVICE_EVENT_RESET_SUCCESS);2230			reset_complete = 1;2231		} else {2232			if (pinstance->ioa_shutdown_type != SHUTDOWN_NONE)2233				pinstance->ioa_state = IOA_STATE_IN_BRINGDOWN;2234			pmcraid_reinit_cmdblk(cmd);2235			pmcraid_unregister_hcams(cmd);2236		}2237		break;2238	}2239 2240	/* reset will be completed if ioa_state is either DEAD or UNKNOWN or2241	 * OPERATIONAL. Reset all control variables used during reset, wake up2242	 * any waiting threads and let the SCSI mid-layer send commands. Note2243	 * that host_lock must be held before invoking scsi_report_bus_reset.2244	 */2245	if (reset_complete) {2246		pinstance->ioa_reset_in_progress = 0;2247		pinstance->ioa_reset_attempts = 0;2248		pinstance->reset_cmd = NULL;2249		pinstance->ioa_shutdown_type = SHUTDOWN_NONE;2250		pinstance->ioa_bringdown = 0;2251		pmcraid_return_cmd(cmd);2252 2253		/* If target state is to bring up the adapter, proceed with2254		 * hcam registration and resource exposure to mid-layer.2255		 */2256		if (pinstance->ioa_state == IOA_STATE_OPERATIONAL)2257			pmcraid_register_hcams(pinstance);2258 2259		wake_up_all(&pinstance->reset_wait_q);2260	}2261 2262	return;2263}2264 2265/**2266 * pmcraid_initiate_reset - initiates reset sequence. This is called from2267 * ISR/tasklet during error interrupts including IOA unit check. If reset2268 * is already in progress, it just returns, otherwise initiates IOA reset2269 * to bring IOA up to operational state.2270 *2271 * @pinstance: pointer to adapter instance structure2272 *2273 * Return value2274 *	 none2275 */2276static void pmcraid_initiate_reset(struct pmcraid_instance *pinstance)2277{2278	struct pmcraid_cmd *cmd;2279 2280	/* If the reset is already in progress, just return, otherwise start2281	 * reset sequence and return2282	 */2283	if (!pinstance->ioa_reset_in_progress) {2284		scsi_block_requests(pinstance->host);2285		cmd = pmcraid_get_free_cmd(pinstance);2286 2287		if (cmd == NULL) {2288			pmcraid_err("no cmnd blocks for initiate_reset\n");2289			return;2290		}2291 2292		pinstance->ioa_shutdown_type = SHUTDOWN_NONE;2293		pinstance->reset_cmd = cmd;2294		pinstance->force_ioa_reset = 1;2295		pmcraid_notify_ioastate(pinstance,2296					PMC_DEVICE_EVENT_RESET_START);2297		pmcraid_ioa_reset(cmd);2298	}2299}2300 2301/**2302 * pmcraid_reset_reload - utility routine for doing IOA reset either to bringup2303 *			  or bringdown IOA2304 * @pinstance: pointer adapter instance structure2305 * @shutdown_type: shutdown type to be used NONE, NORMAL or ABRREV2306 * @target_state: expected target state after reset2307 *2308 * Note: This command initiates reset and waits for its completion. Hence this2309 * should not be called from isr/timer/tasklet functions (timeout handlers,2310 * error response handlers and interrupt handlers).2311 *2312 * Return Value2313 *	 1 in case ioa_state is not target_state, 0 otherwise.2314 */2315static int pmcraid_reset_reload(2316	struct pmcraid_instance *pinstance,2317	u8 shutdown_type,2318	u8 target_state2319)2320{2321	struct pmcraid_cmd *reset_cmd = NULL;2322	unsigned long lock_flags;2323	int reset = 1;2324 2325	spin_lock_irqsave(pinstance->host->host_lock, lock_flags);2326 2327	if (pinstance->ioa_reset_in_progress) {2328		pmcraid_info("reset_reload: reset is already in progress\n");2329 2330		spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);2331 2332		wait_event(pinstance->reset_wait_q,2333			   !pinstance->ioa_reset_in_progress);2334 2335		spin_lock_irqsave(pinstance->host->host_lock, lock_flags);2336 2337		if (pinstance->ioa_state == IOA_STATE_DEAD) {2338			pmcraid_info("reset_reload: IOA is dead\n");2339			goto out_unlock;2340		}2341 2342		if (pinstance->ioa_state == target_state) {2343			reset = 0;2344			goto out_unlock;2345		}2346	}2347 2348	pmcraid_info("reset_reload: proceeding with reset\n");2349	scsi_block_requests(pinstance->host);2350	reset_cmd = pmcraid_get_free_cmd(pinstance);2351	if (reset_cmd == NULL) {2352		pmcraid_err("no free cmnd for reset_reload\n");2353		goto out_unlock;2354	}2355 2356	if (shutdown_type == SHUTDOWN_NORMAL)2357		pinstance->ioa_bringdown = 1;2358 2359	pinstance->ioa_shutdown_type = shutdown_type;2360	pinstance->reset_cmd = reset_cmd;2361	pinstance->force_ioa_reset = reset;2362	pmcraid_info("reset_reload: initiating reset\n");2363	pmcraid_ioa_reset(reset_cmd);2364	spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);2365	pmcraid_info("reset_reload: waiting for reset to complete\n");2366	wait_event(pinstance->reset_wait_q,2367		   !pinstance->ioa_reset_in_progress);2368 2369	pmcraid_info("reset_reload: reset is complete !!\n");2370	scsi_unblock_requests(pinstance->host);2371	return pinstance->ioa_state != target_state;2372 2373out_unlock:2374	spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);2375	return reset;2376}2377 2378/**2379 * pmcraid_reset_bringdown - wrapper over pmcraid_reset_reload to bringdown IOA2380 *2381 * @pinstance: pointer to adapter instance structure2382 *2383 * Return Value2384 *	 whatever is returned from pmcraid_reset_reload2385 */2386static int pmcraid_reset_bringdown(struct pmcraid_instance *pinstance)2387{2388	return pmcraid_reset_reload(pinstance,2389				    SHUTDOWN_NORMAL,2390				    IOA_STATE_UNKNOWN);2391}2392 2393/**2394 * pmcraid_reset_bringup - wrapper over pmcraid_reset_reload to bring up IOA2395 *2396 * @pinstance: pointer to adapter instance structure2397 *2398 * Return Value2399 *	 whatever is returned from pmcraid_reset_reload2400 */2401static int pmcraid_reset_bringup(struct pmcraid_instance *pinstance)2402{2403	pmcraid_notify_ioastate(pinstance, PMC_DEVICE_EVENT_RESET_START);2404 2405	return pmcraid_reset_reload(pinstance,2406				    SHUTDOWN_NONE,2407				    IOA_STATE_OPERATIONAL);2408}2409 2410/**2411 * pmcraid_request_sense - Send request sense to a device2412 * @cmd: pmcraid command struct2413 *2414 * This function sends a request sense to a device as a result of a check2415 * condition. This method re-uses the same command block that failed earlier.2416 */2417static void pmcraid_request_sense(struct pmcraid_cmd *cmd)2418{2419	struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb;2420	struct pmcraid_ioadl_desc *ioadl = ioarcb->add_data.u.ioadl;2421	struct device *dev = &cmd->drv_inst->pdev->dev;2422 2423	cmd->sense_buffer = cmd->scsi_cmd->sense_buffer;2424	cmd->sense_buffer_dma = dma_map_single(dev, cmd->sense_buffer,2425			SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);2426	if (dma_mapping_error(dev, cmd->sense_buffer_dma)) {2427		pmcraid_err2428			("couldn't allocate sense buffer for request sense\n");2429		pmcraid_erp_done(cmd);2430		return;2431	}2432 2433	/* re-use the command block */2434	memset(&cmd->ioa_cb->ioasa, 0, sizeof(struct pmcraid_ioasa));2435	memset(ioarcb->cdb, 0, PMCRAID_MAX_CDB_LEN);2436	ioarcb->request_flags0 = (SYNC_COMPLETE |2437				  NO_LINK_DESCS |2438				  INHIBIT_UL_CHECK);2439	ioarcb->request_type = REQ_TYPE_SCSI;2440	ioarcb->cdb[0] = REQUEST_SENSE;2441	ioarcb->cdb[4] = SCSI_SENSE_BUFFERSIZE;2442 2443	ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) +2444					offsetof(struct pmcraid_ioarcb,2445						add_data.u.ioadl[0]));2446	ioarcb->ioadl_length = cpu_to_le32(sizeof(struct pmcraid_ioadl_desc));2447 2448	ioarcb->data_transfer_length = cpu_to_le32(SCSI_SENSE_BUFFERSIZE);2449 2450	ioadl->address = cpu_to_le64(cmd->sense_buffer_dma);2451	ioadl->data_len = cpu_to_le32(SCSI_SENSE_BUFFERSIZE);2452	ioadl->flags = IOADL_FLAGS_LAST_DESC;2453 2454	/* request sense might be called as part of error response processing2455	 * which runs in tasklets context. It is possible that mid-layer might2456	 * schedule queuecommand during this time, hence, writting to IOARRIN2457	 * must be protect by host_lock2458	 */2459	pmcraid_send_cmd(cmd, pmcraid_erp_done,2460			 PMCRAID_REQUEST_SENSE_TIMEOUT,2461			 pmcraid_timeout_handler);2462}2463 2464/**2465 * pmcraid_cancel_all - cancel all outstanding IOARCBs as part of error recovery2466 * @cmd: command that failed2467 * @need_sense: true if request_sense is required after cancel all2468 *2469 * This function sends a cancel all to a device to clear the queue.2470 */2471static void pmcraid_cancel_all(struct pmcraid_cmd *cmd, bool need_sense)2472{2473	struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd;2474	struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb;2475	struct pmcraid_resource_entry *res = scsi_cmd->device->hostdata;2476 2477	memset(ioarcb->cdb, 0, PMCRAID_MAX_CDB_LEN);2478	ioarcb->request_flags0 = SYNC_OVERRIDE;2479	ioarcb->request_type = REQ_TYPE_IOACMD;2480	ioarcb->cdb[0] = PMCRAID_CANCEL_ALL_REQUESTS;2481 2482	if (RES_IS_GSCSI(res->cfg_entry))2483		ioarcb->cdb[1] = PMCRAID_SYNC_COMPLETE_AFTER_CANCEL;2484 2485	ioarcb->ioadl_bus_addr = 0;2486	ioarcb->ioadl_length = 0;2487	ioarcb->data_transfer_length = 0;2488	ioarcb->ioarcb_bus_addr &= cpu_to_le64((~0x1FULL));2489 2490	/* writing to IOARRIN must be protected by host_lock, as mid-layer2491	 * schedule queuecommand while we are doing this2492	 */2493	pmcraid_send_cmd(cmd, need_sense ?2494			 pmcraid_erp_done : pmcraid_request_sense,2495			 PMCRAID_REQUEST_SENSE_TIMEOUT,2496			 pmcraid_timeout_handler);2497}2498 2499/**2500 * pmcraid_frame_auto_sense: frame fixed format sense information2501 *2502 * @cmd: pointer to failing command block2503 *2504 * Return value2505 *  none2506 */2507static void pmcraid_frame_auto_sense(struct pmcraid_cmd *cmd)2508{2509	u8 *sense_buf = cmd->scsi_cmd->sense_buffer;2510	struct pmcraid_resource_entry *res = cmd->scsi_cmd->device->hostdata;2511	struct pmcraid_ioasa *ioasa = &cmd->ioa_cb->ioasa;2512	u32 ioasc = le32_to_cpu(ioasa->ioasc);2513	u32 failing_lba = 0;2514 2515	memset(sense_buf, 0, SCSI_SENSE_BUFFERSIZE);2516	cmd->scsi_cmd->result = SAM_STAT_CHECK_CONDITION;2517 2518	if (RES_IS_VSET(res->cfg_entry) &&2519	    ioasc == PMCRAID_IOASC_ME_READ_ERROR_NO_REALLOC &&2520	    ioasa->u.vset.failing_lba_hi != 0) {2521 2522		sense_buf[0] = 0x72;2523		sense_buf[1] = PMCRAID_IOASC_SENSE_KEY(ioasc);2524		sense_buf[2] = PMCRAID_IOASC_SENSE_CODE(ioasc);2525		sense_buf[3] = PMCRAID_IOASC_SENSE_QUAL(ioasc);2526 2527		sense_buf[7] = 12;2528		sense_buf[8] = 0;2529		sense_buf[9] = 0x0A;2530		sense_buf[10] = 0x80;2531 2532		failing_lba = le32_to_cpu(ioasa->u.vset.failing_lba_hi);2533 2534		sense_buf[12] = (failing_lba & 0xff000000) >> 24;2535		sense_buf[13] = (failing_lba & 0x00ff0000) >> 16;2536		sense_buf[14] = (failing_lba & 0x0000ff00) >> 8;2537		sense_buf[15] = failing_lba & 0x000000ff;2538 2539		failing_lba = le32_to_cpu(ioasa->u.vset.failing_lba_lo);2540 2541		sense_buf[16] = (failing_lba & 0xff000000) >> 24;2542		sense_buf[17] = (failing_lba & 0x00ff0000) >> 16;2543		sense_buf[18] = (failing_lba & 0x0000ff00) >> 8;2544		sense_buf[19] = failing_lba & 0x000000ff;2545	} else {2546		sense_buf[0] = 0x70;2547		sense_buf[2] = PMCRAID_IOASC_SENSE_KEY(ioasc);2548		sense_buf[12] = PMCRAID_IOASC_SENSE_CODE(ioasc);2549		sense_buf[13] = PMCRAID_IOASC_SENSE_QUAL(ioasc);2550 2551		if (ioasc == PMCRAID_IOASC_ME_READ_ERROR_NO_REALLOC) {2552			if (RES_IS_VSET(res->cfg_entry))2553				failing_lba =2554					le32_to_cpu(ioasa->u.2555						 vset.failing_lba_lo);2556			sense_buf[0] |= 0x80;2557			sense_buf[3] = (failing_lba >> 24) & 0xff;2558			sense_buf[4] = (failing_lba >> 16) & 0xff;2559			sense_buf[5] = (failing_lba >> 8) & 0xff;2560			sense_buf[6] = failing_lba & 0xff;2561		}2562 2563		sense_buf[7] = 6; /* additional length */2564	}2565}2566 2567/**2568 * pmcraid_error_handler - Error response handlers for a SCSI op2569 * @cmd: pointer to pmcraid_cmd that has failed2570 *2571 * This function determines whether or not to initiate ERP on the affected2572 * device. This is called from a tasklet, which doesn't hold any locks.2573 *2574 * Return value:2575 *	 0 it caller can complete the request, otherwise 1 where in error2576 *	 handler itself completes the request and returns the command block2577 *	 back to free-pool2578 */2579static int pmcraid_error_handler(struct pmcraid_cmd *cmd)2580{2581	struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd;2582	struct pmcraid_resource_entry *res = scsi_cmd->device->hostdata;2583	struct pmcraid_instance *pinstance = cmd->drv_inst;2584	struct pmcraid_ioasa *ioasa = &cmd->ioa_cb->ioasa;2585	u32 ioasc = le32_to_cpu(ioasa->ioasc);2586	u32 masked_ioasc = ioasc & PMCRAID_IOASC_SENSE_MASK;2587	bool sense_copied = false;2588 2589	if (!res) {2590		pmcraid_info("resource pointer is NULL\n");2591		return 0;2592	}2593 2594	/* If this was a SCSI read/write command keep count of errors */2595	if (SCSI_CMD_TYPE(scsi_cmd->cmnd[0]) == SCSI_READ_CMD)2596		atomic_inc(&res->read_failures);2597	else if (SCSI_CMD_TYPE(scsi_cmd->cmnd[0]) == SCSI_WRITE_CMD)2598		atomic_inc(&res->write_failures);2599 2600	if (!RES_IS_GSCSI(res->cfg_entry) &&2601		masked_ioasc != PMCRAID_IOASC_HW_DEVICE_BUS_STATUS_ERROR) {2602		pmcraid_frame_auto_sense(cmd);2603	}2604 2605	/* Log IOASC/IOASA information based on user settings */2606	pmcraid_ioasc_logger(ioasc, cmd);2607 2608	switch (masked_ioasc) {2609 2610	case PMCRAID_IOASC_AC_TERMINATED_BY_HOST:2611		scsi_cmd->result |= (DID_ABORT << 16);2612		break;2613 2614	case PMCRAID_IOASC_IR_INVALID_RESOURCE_HANDLE:2615	case PMCRAID_IOASC_HW_CANNOT_COMMUNICATE:2616		scsi_cmd->result |= (DID_NO_CONNECT << 16);2617		break;2618 2619	case PMCRAID_IOASC_NR_SYNC_REQUIRED:2620		res->sync_reqd = 1;2621		scsi_cmd->result |= (DID_IMM_RETRY << 16);2622		break;2623 2624	case PMCRAID_IOASC_ME_READ_ERROR_NO_REALLOC:2625		scsi_cmd->result |= (DID_PASSTHROUGH << 16);2626		break;2627 2628	case PMCRAID_IOASC_UA_BUS_WAS_RESET:2629	case PMCRAID_IOASC_UA_BUS_WAS_RESET_BY_OTHER:2630		if (!res->reset_progress)2631			scsi_report_bus_reset(pinstance->host,2632					      scsi_cmd->device->channel);2633		scsi_cmd->result |= (DID_ERROR << 16);2634		break;2635 2636	case PMCRAID_IOASC_HW_DEVICE_BUS_STATUS_ERROR:2637		scsi_cmd->result |= PMCRAID_IOASC_SENSE_STATUS(ioasc);2638		res->sync_reqd = 1;2639 2640		/* if check_condition is not active return with error otherwise2641		 * get/frame the sense buffer2642		 */2643		if (PMCRAID_IOASC_SENSE_STATUS(ioasc) !=2644		    SAM_STAT_CHECK_CONDITION &&2645		    PMCRAID_IOASC_SENSE_STATUS(ioasc) != SAM_STAT_ACA_ACTIVE)2646			return 0;2647 2648		/* If we have auto sense data as part of IOASA pass it to2649		 * mid-layer2650		 */2651		if (ioasa->auto_sense_length != 0) {2652			short sense_len = le16_to_cpu(ioasa->auto_sense_length);2653			int data_size = min_t(u16, sense_len,2654					      SCSI_SENSE_BUFFERSIZE);2655 2656			memcpy(scsi_cmd->sense_buffer,2657			       ioasa->sense_data,2658			       data_size);2659			sense_copied = true;2660		}2661 2662		if (RES_IS_GSCSI(res->cfg_entry))2663			pmcraid_cancel_all(cmd, sense_copied);2664		else if (sense_copied)2665			pmcraid_erp_done(cmd);2666		else2667			pmcraid_request_sense(cmd);2668 2669		return 1;2670 2671	case PMCRAID_IOASC_NR_INIT_CMD_REQUIRED:2672		break;2673 2674	default:2675		if (PMCRAID_IOASC_SENSE_KEY(ioasc) > RECOVERED_ERROR)2676			scsi_cmd->result |= (DID_ERROR << 16);2677		break;2678	}2679	return 0;2680}2681 2682/**2683 * pmcraid_reset_device - device reset handler functions2684 *2685 * @scsi_dev: scsi device struct2686 * @timeout: command timeout2687 * @modifier: reset modifier indicating the reset sequence to be performed2688 *2689 * This function issues a device reset to the affected device.2690 * A LUN reset will be sent to the device first. If that does2691 * not work, a target reset will be sent.2692 *2693 * Return value:2694 *	SUCCESS / FAILED2695 */2696static int pmcraid_reset_device(2697	struct scsi_device *scsi_dev,2698	unsigned long timeout,2699	u8 modifier)2700{2701	struct pmcraid_cmd *cmd;2702	struct pmcraid_instance *pinstance;2703	struct pmcraid_resource_entry *res;2704	struct pmcraid_ioarcb *ioarcb;2705	unsigned long lock_flags;2706	u32 ioasc;2707 2708	pinstance =2709		(struct pmcraid_instance *)scsi_dev->host->hostdata;2710	res = scsi_dev->hostdata;2711 2712	if (!res) {2713		sdev_printk(KERN_ERR, scsi_dev,2714			    "reset_device: NULL resource pointer\n");2715		return FAILED;2716	}2717 2718	/* If adapter is currently going through reset/reload, return failed.2719	 * This will force the mid-layer to call _eh_bus/host reset, which2720	 * will then go to sleep and wait for the reset to complete2721	 */2722	spin_lock_irqsave(pinstance->host->host_lock, lock_flags);2723	if (pinstance->ioa_reset_in_progress ||2724	    pinstance->ioa_state == IOA_STATE_DEAD) {2725		spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);2726		return FAILED;2727	}2728 2729	res->reset_progress = 1;2730	pmcraid_info("Resetting %s resource with addr %x\n",2731		     ((modifier & RESET_DEVICE_LUN) ? "LUN" :2732		     ((modifier & RESET_DEVICE_TARGET) ? "TARGET" : "BUS")),2733		     le32_to_cpu(res->cfg_entry.resource_address));2734 2735	/* get a free cmd block */2736	cmd = pmcraid_get_free_cmd(pinstance);2737 2738	if (cmd == NULL) {2739		spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);2740		pmcraid_err("%s: no cmd blocks are available\n", __func__);2741		return FAILED;2742	}2743 2744	ioarcb = &cmd->ioa_cb->ioarcb;2745	ioarcb->resource_handle = res->cfg_entry.resource_handle;2746	ioarcb->request_type = REQ_TYPE_IOACMD;2747	ioarcb->cdb[0] = PMCRAID_RESET_DEVICE;2748 2749	/* Initialize reset modifier bits */2750	if (modifier)2751		modifier = ENABLE_RESET_MODIFIER | modifier;2752 2753	ioarcb->cdb[1] = modifier;2754 2755	init_completion(&cmd->wait_for_completion);2756	cmd->completion_req = 1;2757 2758	pmcraid_info("cmd(CDB[0] = %x) for %x with index = %d\n",2759		     cmd->ioa_cb->ioarcb.cdb[0],2760		     le32_to_cpu(cmd->ioa_cb->ioarcb.resource_handle),2761		     le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2);2762 2763	pmcraid_send_cmd(cmd,2764			 pmcraid_internal_done,2765			 timeout,2766			 pmcraid_timeout_handler);2767 2768	spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);2769 2770	/* RESET_DEVICE command completes after all pending IOARCBs are2771	 * completed. Once this command is completed, pmcraind_internal_done2772	 * will wake up the 'completion' queue.2773	 */2774	wait_for_completion(&cmd->wait_for_completion);2775 2776	/* complete the command here itself and return the command block2777	 * to free list2778	 */2779	pmcraid_return_cmd(cmd);2780	res->reset_progress = 0;2781	ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc);2782 2783	/* set the return value based on the returned ioasc */2784	return PMCRAID_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS;2785}2786 2787/**2788 * _pmcraid_io_done - helper for pmcraid_io_done function2789 *2790 * @cmd: pointer to pmcraid command struct2791 * @reslen: residual data length to be set in the ioasa2792 * @ioasc: ioasc either returned by IOA or set by driver itself.2793 *2794 * This function is invoked by pmcraid_io_done to complete mid-layer2795 * scsi ops.2796 *2797 * Return value:2798 *	  0 if caller is required to return it to free_pool. Returns 1 if2799 *	  caller need not worry about freeing command block as error handler2800 *	  will take care of that.2801 */2802 2803static int _pmcraid_io_done(struct pmcraid_cmd *cmd, int reslen, int ioasc)2804{2805	struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd;2806	int rc = 0;2807 2808	scsi_set_resid(scsi_cmd, reslen);2809 2810	pmcraid_info("response(%d) CDB[0] = %x ioasc:result: %x:%x\n",2811		le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2,2812		cmd->ioa_cb->ioarcb.cdb[0],2813		ioasc, scsi_cmd->result);2814 2815	if (PMCRAID_IOASC_SENSE_KEY(ioasc) != 0)2816		rc = pmcraid_error_handler(cmd);2817 2818	if (rc == 0) {2819		scsi_dma_unmap(scsi_cmd);2820		scsi_done(scsi_cmd);2821	}2822 2823	return rc;2824}2825 2826/**2827 * pmcraid_io_done - SCSI completion function2828 *2829 * @cmd: pointer to pmcraid command struct2830 *2831 * This function is invoked by tasklet/mid-layer error handler to completing2832 * the SCSI ops sent from mid-layer.2833 *2834 * Return value2835 *	  none2836 */2837 2838static void pmcraid_io_done(struct pmcraid_cmd *cmd)2839{2840	u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc);2841	u32 reslen = le32_to_cpu(cmd->ioa_cb->ioasa.residual_data_length);2842 2843	if (_pmcraid_io_done(cmd, reslen, ioasc) == 0)2844		pmcraid_return_cmd(cmd);2845}2846 2847/**2848 * pmcraid_abort_cmd - Aborts a single IOARCB already submitted to IOA2849 *2850 * @cmd: command block of the command to be aborted2851 *2852 * Return Value:2853 *	 returns pointer to command structure used as cancelling cmd2854 */2855static struct pmcraid_cmd *pmcraid_abort_cmd(struct pmcraid_cmd *cmd)2856{2857	struct pmcraid_cmd *cancel_cmd;2858	struct pmcraid_instance *pinstance;2859 2860	pinstance = (struct pmcraid_instance *)cmd->drv_inst;2861 2862	cancel_cmd = pmcraid_get_free_cmd(pinstance);2863 2864	if (cancel_cmd == NULL) {2865		pmcraid_err("%s: no cmd blocks are available\n", __func__);2866		return NULL;2867	}2868 2869	pmcraid_prepare_cancel_cmd(cancel_cmd, cmd);2870 2871	pmcraid_info("aborting command CDB[0]= %x with index = %d\n",2872		cmd->ioa_cb->ioarcb.cdb[0],2873		le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2);2874 2875	init_completion(&cancel_cmd->wait_for_completion);2876	cancel_cmd->completion_req = 1;2877 2878	pmcraid_info("command (%d) CDB[0] = %x for %x\n",2879		le32_to_cpu(cancel_cmd->ioa_cb->ioarcb.response_handle) >> 2,2880		cancel_cmd->ioa_cb->ioarcb.cdb[0],2881		le32_to_cpu(cancel_cmd->ioa_cb->ioarcb.resource_handle));2882 2883	pmcraid_send_cmd(cancel_cmd,2884			 pmcraid_internal_done,2885			 PMCRAID_INTERNAL_TIMEOUT,2886			 pmcraid_timeout_handler);2887	return cancel_cmd;2888}2889 2890/**2891 * pmcraid_abort_complete - Waits for ABORT TASK completion2892 *2893 * @cancel_cmd: command block use as cancelling command2894 *2895 * Return Value:2896 *	 returns SUCCESS if ABORT TASK has good completion2897 *	 otherwise FAILED2898 */2899static int pmcraid_abort_complete(struct pmcraid_cmd *cancel_cmd)2900{2901	struct pmcraid_resource_entry *res;2902	u32 ioasc;2903 2904	wait_for_completion(&cancel_cmd->wait_for_completion);2905	res = cancel_cmd->res;2906	cancel_cmd->res = NULL;2907	ioasc = le32_to_cpu(cancel_cmd->ioa_cb->ioasa.ioasc);2908 2909	/* If the abort task is not timed out we will get a Good completion2910	 * as sense_key, otherwise we may get one the following responses2911	 * due to subsequent bus reset or device reset. In case IOASC is2912	 * NR_SYNC_REQUIRED, set sync_reqd flag for the corresponding resource2913	 */2914	if (ioasc == PMCRAID_IOASC_UA_BUS_WAS_RESET ||2915	    ioasc == PMCRAID_IOASC_NR_SYNC_REQUIRED) {2916		if (ioasc == PMCRAID_IOASC_NR_SYNC_REQUIRED)2917			res->sync_reqd = 1;2918		ioasc = 0;2919	}2920 2921	/* complete the command here itself */2922	pmcraid_return_cmd(cancel_cmd);2923	return PMCRAID_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS;2924}2925 2926/**2927 * pmcraid_eh_abort_handler - entry point for aborting a single task on errors2928 *2929 * @scsi_cmd:   scsi command struct given by mid-layer. When this is called2930 *		mid-layer ensures that no other commands are queued. This2931 *		never gets called under interrupt, but a separate eh thread.2932 *2933 * Return value:2934 *	 SUCCESS / FAILED2935 */2936static int pmcraid_eh_abort_handler(struct scsi_cmnd *scsi_cmd)2937{2938	struct pmcraid_instance *pinstance;2939	struct pmcraid_cmd *cmd;2940	struct pmcraid_resource_entry *res;2941	unsigned long host_lock_flags;2942	unsigned long pending_lock_flags;2943	struct pmcraid_cmd *cancel_cmd = NULL;2944	int cmd_found = 0;2945	int rc = FAILED;2946 2947	pinstance =2948		(struct pmcraid_instance *)scsi_cmd->device->host->hostdata;2949 2950	scmd_printk(KERN_INFO, scsi_cmd,2951		    "I/O command timed out, aborting it.\n");2952 2953	res = scsi_cmd->device->hostdata;2954 2955	if (res == NULL)2956		return rc;2957 2958	/* If we are currently going through reset/reload, return failed.2959	 * This will force the mid-layer to eventually call2960	 * pmcraid_eh_host_reset which will then go to sleep and wait for the2961	 * reset to complete2962	 */2963	spin_lock_irqsave(pinstance->host->host_lock, host_lock_flags);2964 2965	if (pinstance->ioa_reset_in_progress ||2966	    pinstance->ioa_state == IOA_STATE_DEAD) {2967		spin_unlock_irqrestore(pinstance->host->host_lock,2968				       host_lock_flags);2969		return rc;2970	}2971 2972	/* loop over pending cmd list to find cmd corresponding to this2973	 * scsi_cmd. Note that this command might not have been completed2974	 * already. locking: all pending commands are protected with2975	 * pending_pool_lock.2976	 */2977	spin_lock_irqsave(&pinstance->pending_pool_lock, pending_lock_flags);2978	list_for_each_entry(cmd, &pinstance->pending_cmd_pool, free_list) {2979 2980		if (cmd->scsi_cmd == scsi_cmd) {2981			cmd_found = 1;2982			break;2983		}2984	}2985 2986	spin_unlock_irqrestore(&pinstance->pending_pool_lock,2987				pending_lock_flags);2988 2989	/* If the command to be aborted was given to IOA and still pending with2990	 * it, send ABORT_TASK to abort this and wait for its completion2991	 */2992	if (cmd_found)2993		cancel_cmd = pmcraid_abort_cmd(cmd);2994 2995	spin_unlock_irqrestore(pinstance->host->host_lock,2996			       host_lock_flags);2997 2998	if (cancel_cmd) {2999		cancel_cmd->res = cmd->scsi_cmd->device->hostdata;3000		rc = pmcraid_abort_complete(cancel_cmd);3001	}3002 3003	return cmd_found ? rc : SUCCESS;3004}3005 3006/**3007 * pmcraid_eh_device_reset_handler - bus/target/device reset handler callbacks3008 *3009 * @scmd: pointer to scsi_cmd that was sent to the resource to be reset.3010 *3011 * All these routines invokve pmcraid_reset_device with appropriate parameters.3012 * Since these are called from mid-layer EH thread, no other IO will be queued3013 * to the resource being reset. However, control path (IOCTL) may be active so3014 * it is necessary to synchronize IOARRIN writes which pmcraid_reset_device3015 * takes care by locking/unlocking host_lock.3016 *3017 * Return value3018 *	SUCCESS or FAILED3019 */3020static int pmcraid_eh_device_reset_handler(struct scsi_cmnd *scmd)3021{3022	scmd_printk(KERN_INFO, scmd,3023		    "resetting device due to an I/O command timeout.\n");3024	return pmcraid_reset_device(scmd->device,3025				    PMCRAID_INTERNAL_TIMEOUT,3026				    RESET_DEVICE_LUN);3027}3028 3029static int pmcraid_eh_bus_reset_handler(struct scsi_cmnd *scmd)3030{3031	struct Scsi_Host *host = scmd->device->host;3032	struct pmcraid_instance *pinstance =3033		(struct pmcraid_instance *)host->hostdata;3034	struct pmcraid_resource_entry *res = NULL;3035	struct pmcraid_resource_entry *temp;3036	struct scsi_device *sdev = NULL;3037	unsigned long lock_flags;3038 3039	/*3040	 * The reset device code insists on us passing down3041	 * a device, so grab the first device on the bus.3042	 */3043	spin_lock_irqsave(&pinstance->resource_lock, lock_flags);3044	list_for_each_entry(temp, &pinstance->used_res_q, queue) {3045		if (scmd->device->channel == PMCRAID_VSET_BUS_ID &&3046		    RES_IS_VSET(temp->cfg_entry)) {3047			res = temp;3048			break;3049		} else if (scmd->device->channel == PMCRAID_PHYS_BUS_ID &&3050			   RES_IS_GSCSI(temp->cfg_entry)) {3051			res = temp;3052			break;3053		}3054	}3055	if (res)3056		sdev = res->scsi_dev;3057	spin_unlock_irqrestore(&pinstance->resource_lock, lock_flags);3058	if (!sdev)3059		return FAILED;3060 3061	sdev_printk(KERN_INFO, sdev,3062		    "Doing bus reset due to an I/O command timeout.\n");3063	return pmcraid_reset_device(sdev,3064				    PMCRAID_RESET_BUS_TIMEOUT,3065				    RESET_DEVICE_BUS);3066}3067 3068static int pmcraid_eh_target_reset_handler(struct scsi_cmnd *scmd)3069{3070	struct Scsi_Host *shost = scmd->device->host;3071	struct scsi_device *scsi_dev = NULL, *tmp;3072	int ret;3073 3074	shost_for_each_device(tmp, shost) {3075		if ((tmp->channel == scmd->device->channel) &&3076		    (tmp->id == scmd->device->id)) {3077			scsi_dev = tmp;3078			break;3079		}3080	}3081	if (!scsi_dev)3082		return FAILED;3083	sdev_printk(KERN_INFO, scsi_dev,3084		    "Doing target reset due to an I/O command timeout.\n");3085	ret = pmcraid_reset_device(scsi_dev,3086				   PMCRAID_INTERNAL_TIMEOUT,3087				   RESET_DEVICE_TARGET);3088	scsi_device_put(scsi_dev);3089	return ret;3090}3091 3092/**3093 * pmcraid_eh_host_reset_handler - adapter reset handler callback3094 *3095 * @scmd: pointer to scsi_cmd that was sent to a resource of adapter3096 *3097 * Initiates adapter reset to bring it up to operational state3098 *3099 * Return value3100 *	SUCCESS or FAILED3101 */3102static int pmcraid_eh_host_reset_handler(struct scsi_cmnd *scmd)3103{3104	unsigned long interval = 10000; /* 10 seconds interval */3105	int waits = jiffies_to_msecs(PMCRAID_RESET_HOST_TIMEOUT) / interval;3106	struct pmcraid_instance *pinstance =3107		(struct pmcraid_instance *)(scmd->device->host->hostdata);3108 3109 3110	/* wait for an additional 150 seconds just in case firmware could come3111	 * up and if it could complete all the pending commands excluding the3112	 * two HCAM (CCN and LDN).3113	 */3114	while (waits--) {3115		if (atomic_read(&pinstance->outstanding_cmds) <=3116		    PMCRAID_MAX_HCAM_CMD)3117			return SUCCESS;3118		msleep(interval);3119	}3120 3121	dev_err(&pinstance->pdev->dev,3122		"Adapter being reset due to an I/O command timeout.\n");3123	return pmcraid_reset_bringup(pinstance) == 0 ? SUCCESS : FAILED;3124}3125 3126/**3127 * pmcraid_init_ioadls - initializes IOADL related fields in IOARCB3128 * @cmd: pmcraid command struct3129 * @sgcount: count of scatter-gather elements3130 *3131 * Return value3132 *   returns pointer pmcraid_ioadl_desc, initialized to point to internal3133 *   or external IOADLs3134 */3135static struct pmcraid_ioadl_desc *3136pmcraid_init_ioadls(struct pmcraid_cmd *cmd, int sgcount)3137{3138	struct pmcraid_ioadl_desc *ioadl;3139	struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb;3140	int ioadl_count = 0;3141 3142	if (ioarcb->add_cmd_param_length)3143		ioadl_count = DIV_ROUND_UP(le16_to_cpu(ioarcb->add_cmd_param_length), 16);3144	ioarcb->ioadl_length = cpu_to_le32(sizeof(struct pmcraid_ioadl_desc) * sgcount);3145 3146	if ((sgcount + ioadl_count) > (ARRAY_SIZE(ioarcb->add_data.u.ioadl))) {3147		/* external ioadls start at offset 0x80 from control_block3148		 * structure, re-using 24 out of 27 ioadls part of IOARCB.3149		 * It is necessary to indicate to firmware that driver is3150		 * using ioadls to be treated as external to IOARCB.3151		 */3152		ioarcb->ioarcb_bus_addr &= cpu_to_le64(~(0x1FULL));3153		ioarcb->ioadl_bus_addr =3154			cpu_to_le64((cmd->ioa_cb_bus_addr) +3155				offsetof(struct pmcraid_ioarcb,3156					add_data.u.ioadl[3]));3157		ioadl = &ioarcb->add_data.u.ioadl[3];3158	} else {3159		ioarcb->ioadl_bus_addr =3160			cpu_to_le64((cmd->ioa_cb_bus_addr) +3161				offsetof(struct pmcraid_ioarcb,3162					add_data.u.ioadl[ioadl_count]));3163 3164		ioadl = &ioarcb->add_data.u.ioadl[ioadl_count];3165		ioarcb->ioarcb_bus_addr |=3166			cpu_to_le64(DIV_ROUND_CLOSEST(sgcount + ioadl_count, 8));3167	}3168 3169	return ioadl;3170}3171 3172/**3173 * pmcraid_build_ioadl - Build a scatter/gather list and map the buffer3174 * @pinstance: pointer to adapter instance structure3175 * @cmd: pmcraid command struct3176 *3177 * This function is invoked by queuecommand entry point while sending a command3178 * to firmware. This builds ioadl descriptors and sets up ioarcb fields.3179 *3180 * Return value:3181 *	0 on success or -1 on failure3182 */3183static int pmcraid_build_ioadl(3184	struct pmcraid_instance *pinstance,3185	struct pmcraid_cmd *cmd3186)3187{3188	int i, nseg;3189	struct scatterlist *sglist;3190 3191	struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd;3192	struct pmcraid_ioarcb *ioarcb = &(cmd->ioa_cb->ioarcb);3193	struct pmcraid_ioadl_desc *ioadl;3194 3195	u32 length = scsi_bufflen(scsi_cmd);3196 3197	if (!length)3198		return 0;3199 3200	nseg = scsi_dma_map(scsi_cmd);3201 3202	if (nseg < 0) {3203		scmd_printk(KERN_ERR, scsi_cmd, "scsi_map_dma failed!\n");3204		return -1;3205	} else if (nseg > PMCRAID_MAX_IOADLS) {3206		scsi_dma_unmap(scsi_cmd);3207		scmd_printk(KERN_ERR, scsi_cmd,3208			"sg count is (%d) more than allowed!\n", nseg);3209		return -1;3210	}3211 3212	/* Initialize IOARCB data transfer length fields */3213	if (scsi_cmd->sc_data_direction == DMA_TO_DEVICE)3214		ioarcb->request_flags0 |= TRANSFER_DIR_WRITE;3215 3216	ioarcb->request_flags0 |= NO_LINK_DESCS;3217	ioarcb->data_transfer_length = cpu_to_le32(length);3218	ioadl = pmcraid_init_ioadls(cmd, nseg);3219 3220	/* Initialize IOADL descriptor addresses */3221	scsi_for_each_sg(scsi_cmd, sglist, nseg, i) {3222		ioadl[i].data_len = cpu_to_le32(sg_dma_len(sglist));3223		ioadl[i].address = cpu_to_le64(sg_dma_address(sglist));3224		ioadl[i].flags = 0;3225	}3226	/* setup last descriptor */3227	ioadl[i - 1].flags = IOADL_FLAGS_LAST_DESC;3228 3229	return 0;3230}3231 3232/**3233 * pmcraid_queuecommand_lck - Queue a mid-layer request3234 * @scsi_cmd: scsi command struct3235 *3236 * This function queues a request generated by the mid-layer. Midlayer calls3237 * this routine within host->lock. Some of the functions called by queuecommand3238 * would use cmd block queue locks (free_pool_lock and pending_pool_lock)3239 *3240 * Return value:3241 *	  0 on success3242 *	  SCSI_MLQUEUE_DEVICE_BUSY if device is busy3243 *	  SCSI_MLQUEUE_HOST_BUSY if host is busy3244 */3245static int pmcraid_queuecommand_lck(struct scsi_cmnd *scsi_cmd)3246{3247	struct pmcraid_instance *pinstance;3248	struct pmcraid_resource_entry *res;3249	struct pmcraid_ioarcb *ioarcb;3250	struct pmcraid_cmd *cmd;3251	u32 fw_version;3252	int rc = 0;3253 3254	pinstance =3255		(struct pmcraid_instance *)scsi_cmd->device->host->hostdata;3256	fw_version = be16_to_cpu(pinstance->inq_data->fw_version);3257	res = scsi_cmd->device->hostdata;3258	scsi_cmd->result = (DID_OK << 16);3259 3260	/* if adapter is marked as dead, set result to DID_NO_CONNECT complete3261	 * the command3262	 */3263	if (pinstance->ioa_state == IOA_STATE_DEAD) {3264		pmcraid_info("IOA is dead, but queuecommand is scheduled\n");3265		scsi_cmd->result = (DID_NO_CONNECT << 16);3266		scsi_done(scsi_cmd);3267		return 0;3268	}3269 3270	/* If IOA reset is in progress, can't queue the commands */3271	if (pinstance->ioa_reset_in_progress)3272		return SCSI_MLQUEUE_HOST_BUSY;3273 3274	/* Firmware doesn't support SYNCHRONIZE_CACHE command (0x35), complete3275	 * the command here itself with success return3276	 */3277	if (scsi_cmd->cmnd[0] == SYNCHRONIZE_CACHE) {3278		pmcraid_info("SYNC_CACHE(0x35), completing in driver itself\n");3279		scsi_done(scsi_cmd);3280		return 0;3281	}3282 3283	/* initialize the command and IOARCB to be sent to IOA */3284	cmd = pmcraid_get_free_cmd(pinstance);3285 3286	if (cmd == NULL) {3287		pmcraid_err("free command block is not available\n");3288		return SCSI_MLQUEUE_HOST_BUSY;3289	}3290 3291	cmd->scsi_cmd = scsi_cmd;3292	ioarcb = &(cmd->ioa_cb->ioarcb);3293	memcpy(ioarcb->cdb, scsi_cmd->cmnd, scsi_cmd->cmd_len);3294	ioarcb->resource_handle = res->cfg_entry.resource_handle;3295	ioarcb->request_type = REQ_TYPE_SCSI;3296 3297	/* set hrrq number where the IOA should respond to. Note that all cmds3298	 * generated internally uses hrrq_id 0, exception to this is the cmd3299	 * block of scsi_cmd which is re-used (e.g. cancel/abort), which uses3300	 * hrrq_id assigned here in queuecommand3301	 */3302	ioarcb->hrrq_id = atomic_add_return(1, &(pinstance->last_message_id)) %3303			  pinstance->num_hrrq;3304	cmd->cmd_done = pmcraid_io_done;3305 3306	if (RES_IS_GSCSI(res->cfg_entry) || RES_IS_VSET(res->cfg_entry)) {3307		if (scsi_cmd->underflow == 0)3308			ioarcb->request_flags0 |= INHIBIT_UL_CHECK;3309 3310		if (res->sync_reqd) {3311			ioarcb->request_flags0 |= SYNC_COMPLETE;3312			res->sync_reqd = 0;3313		}3314 3315		ioarcb->request_flags0 |= NO_LINK_DESCS;3316 3317		if (scsi_cmd->flags & SCMD_TAGGED)3318			ioarcb->request_flags1 |= TASK_TAG_SIMPLE;3319 3320		if (RES_IS_GSCSI(res->cfg_entry))3321			ioarcb->request_flags1 |= DELAY_AFTER_RESET;3322	}3323 3324	rc = pmcraid_build_ioadl(pinstance, cmd);3325 3326	pmcraid_info("command (%d) CDB[0] = %x for %x:%x:%x:%x\n",3327		     le32_to_cpu(ioarcb->response_handle) >> 2,3328		     scsi_cmd->cmnd[0], pinstance->host->unique_id,3329		     RES_IS_VSET(res->cfg_entry) ? PMCRAID_VSET_BUS_ID :3330			PMCRAID_PHYS_BUS_ID,3331		     RES_IS_VSET(res->cfg_entry) ?3332			(fw_version <= PMCRAID_FW_VERSION_1 ?3333				res->cfg_entry.unique_flags1 :3334				le16_to_cpu(res->cfg_entry.array_id) & 0xFF) :3335			RES_TARGET(res->cfg_entry.resource_address),3336		     RES_LUN(res->cfg_entry.resource_address));3337 3338	if (likely(rc == 0)) {3339		_pmcraid_fire_command(cmd);3340	} else {3341		pmcraid_err("queuecommand could not build ioadl\n");3342		pmcraid_return_cmd(cmd);3343		rc = SCSI_MLQUEUE_HOST_BUSY;3344	}3345 3346	return rc;3347}3348 3349static DEF_SCSI_QCMD(pmcraid_queuecommand)3350 3351/*3352 * pmcraid_open -char node "open" entry, allowed only users with admin access3353 */3354static int pmcraid_chr_open(struct inode *inode, struct file *filep)3355{3356	struct pmcraid_instance *pinstance;3357 3358	if (!capable(CAP_SYS_ADMIN))3359		return -EACCES;3360 3361	/* Populate adapter instance * pointer for use by ioctl */3362	pinstance = container_of(inode->i_cdev, struct pmcraid_instance, cdev);3363	filep->private_data = pinstance;3364 3365	return 0;3366}3367 3368/*3369 * pmcraid_fasync - Async notifier registration from applications3370 *3371 * This function adds the calling process to a driver global queue. When an3372 * event occurs, SIGIO will be sent to all processes in this queue.3373 */3374static int pmcraid_chr_fasync(int fd, struct file *filep, int mode)3375{3376	struct pmcraid_instance *pinstance;3377	int rc;3378 3379	pinstance = filep->private_data;3380	mutex_lock(&pinstance->aen_queue_lock);3381	rc = fasync_helper(fd, filep, mode, &pinstance->aen_queue);3382	mutex_unlock(&pinstance->aen_queue_lock);3383 3384	return rc;3385}3386 3387/**3388 * pmcraid_ioctl_driver - ioctl handler for commands handled by driver itself3389 *3390 * @pinstance: pointer to adapter instance structure3391 * @cmd: ioctl command passed in3392 * @buflen: length of user_buffer3393 * @user_buffer: user buffer pointer3394 *3395 * Return Value3396 *   0 in case of success, otherwise appropriate error code3397 */3398static long pmcraid_ioctl_driver(3399	struct pmcraid_instance *pinstance,3400	unsigned int cmd,3401	unsigned int buflen,3402	void __user *user_buffer3403)3404{3405	int rc = -ENOSYS;3406 3407	switch (cmd) {3408	case PMCRAID_IOCTL_RESET_ADAPTER:3409		pmcraid_reset_bringup(pinstance);3410		rc = 0;3411		break;3412 3413	default:3414		break;3415	}3416 3417	return rc;3418}3419 3420/**3421 * pmcraid_check_ioctl_buffer - check for proper access to user buffer3422 *3423 * @cmd: ioctl command3424 * @arg: user buffer3425 * @hdr: pointer to kernel memory for pmcraid_ioctl_header3426 *3427 * Return Value3428 *	negetive error code if there are access issues, otherwise zero.3429 *	Upon success, returns ioctl header copied out of user buffer.3430 */3431 3432static int pmcraid_check_ioctl_buffer(3433	int cmd,3434	void __user *arg,3435	struct pmcraid_ioctl_header *hdr3436)3437{3438	int rc;3439 3440	if (copy_from_user(hdr, arg, sizeof(struct pmcraid_ioctl_header))) {3441		pmcraid_err("couldn't copy ioctl header from user buffer\n");3442		return -EFAULT;3443	}3444 3445	/* check for valid driver signature */3446	rc = memcmp(hdr->signature,3447		    PMCRAID_IOCTL_SIGNATURE,3448		    sizeof(hdr->signature));3449	if (rc) {3450		pmcraid_err("signature verification failed\n");3451		return -EINVAL;3452	}3453 3454	return 0;3455}3456 3457/*3458 *  pmcraid_ioctl - char node ioctl entry point3459 */3460static long pmcraid_chr_ioctl(3461	struct file *filep,3462	unsigned int cmd,3463	unsigned long arg3464)3465{3466	struct pmcraid_instance *pinstance = NULL;3467	struct pmcraid_ioctl_header *hdr = NULL;3468	void __user *argp = (void __user *)arg;3469	int retval = -ENOTTY;3470 3471	hdr = kmalloc(sizeof(struct pmcraid_ioctl_header), GFP_KERNEL);3472 3473	if (!hdr) {3474		pmcraid_err("failed to allocate memory for ioctl header\n");3475		return -ENOMEM;3476	}3477 3478	retval = pmcraid_check_ioctl_buffer(cmd, argp, hdr);3479 3480	if (retval) {3481		pmcraid_info("chr_ioctl: header check failed\n");3482		kfree(hdr);3483		return retval;3484	}3485 3486	pinstance = filep->private_data;3487 3488	if (!pinstance) {3489		pmcraid_info("adapter instance is not found\n");3490		kfree(hdr);3491		return -ENOTTY;3492	}3493 3494	switch (_IOC_TYPE(cmd)) {3495 3496	case PMCRAID_DRIVER_IOCTL:3497		arg += sizeof(struct pmcraid_ioctl_header);3498		retval = pmcraid_ioctl_driver(pinstance, cmd,3499					      hdr->buffer_length, argp);3500		break;3501 3502	default:3503		retval = -ENOTTY;3504		break;3505	}3506 3507	kfree(hdr);3508 3509	return retval;3510}3511 3512/*3513 * File operations structure for management interface3514 */3515static const struct file_operations pmcraid_fops = {3516	.owner = THIS_MODULE,3517	.open = pmcraid_chr_open,3518	.fasync = pmcraid_chr_fasync,3519	.unlocked_ioctl = pmcraid_chr_ioctl,3520	.compat_ioctl = compat_ptr_ioctl,3521	.llseek = noop_llseek,3522};3523 3524 3525 3526 3527/**3528 * pmcraid_show_log_level - Display adapter's error logging level3529 * @dev: class device struct3530 * @attr: unused3531 * @buf: buffer3532 *3533 * Return value:3534 *  number of bytes printed to buffer3535 */3536static ssize_t pmcraid_show_log_level(3537	struct device *dev,3538	struct device_attribute *attr,3539	char *buf)3540{3541	struct Scsi_Host *shost = class_to_shost(dev);3542	struct pmcraid_instance *pinstance =3543		(struct pmcraid_instance *)shost->hostdata;3544	return snprintf(buf, PAGE_SIZE, "%d\n", pinstance->current_log_level);3545}3546 3547/**3548 * pmcraid_store_log_level - Change the adapter's error logging level3549 * @dev: class device struct3550 * @attr: unused3551 * @buf: buffer3552 * @count: not used3553 *3554 * Return value:3555 *  number of bytes printed to buffer3556 */3557static ssize_t pmcraid_store_log_level(3558	struct device *dev,3559	struct device_attribute *attr,3560	const char *buf,3561	size_t count3562)3563{3564	struct Scsi_Host *shost;3565	struct pmcraid_instance *pinstance;3566	u8 val;3567 3568	if (kstrtou8(buf, 10, &val))3569		return -EINVAL;3570	/* log-level should be from 0 to 2 */3571	if (val > 2)3572		return -EINVAL;3573 3574	shost = class_to_shost(dev);3575	pinstance = (struct pmcraid_instance *)shost->hostdata;3576	pinstance->current_log_level = val;3577 3578	return strlen(buf);3579}3580 3581static struct device_attribute pmcraid_log_level_attr = {3582	.attr = {3583		 .name = "log_level",3584		 .mode = S_IRUGO | S_IWUSR,3585		 },3586	.show = pmcraid_show_log_level,3587	.store = pmcraid_store_log_level,3588};3589 3590/**3591 * pmcraid_show_drv_version - Display driver version3592 * @dev: class device struct3593 * @attr: unused3594 * @buf: buffer3595 *3596 * Return value:3597 *  number of bytes printed to buffer3598 */3599static ssize_t pmcraid_show_drv_version(3600	struct device *dev,3601	struct device_attribute *attr,3602	char *buf3603)3604{3605	return snprintf(buf, PAGE_SIZE, "version: %s\n",3606			PMCRAID_DRIVER_VERSION);3607}3608 3609static struct device_attribute pmcraid_driver_version_attr = {3610	.attr = {3611		 .name = "drv_version",3612		 .mode = S_IRUGO,3613		 },3614	.show = pmcraid_show_drv_version,3615};3616 3617/**3618 * pmcraid_show_adapter_id - Display driver assigned adapter id3619 * @dev: class device struct3620 * @attr: unused3621 * @buf: buffer3622 *3623 * Return value:3624 *  number of bytes printed to buffer3625 */3626static ssize_t pmcraid_show_adapter_id(3627	struct device *dev,3628	struct device_attribute *attr,3629	char *buf3630)3631{3632	struct Scsi_Host *shost = class_to_shost(dev);3633	struct pmcraid_instance *pinstance =3634		(struct pmcraid_instance *)shost->hostdata;3635	u32 adapter_id = pci_dev_id(pinstance->pdev);3636	u32 aen_group = pmcraid_event_family.id;3637 3638	return snprintf(buf, PAGE_SIZE,3639			"adapter id: %d\nminor: %d\naen group: %d\n",3640			adapter_id, MINOR(pinstance->cdev.dev), aen_group);3641}3642 3643static struct device_attribute pmcraid_adapter_id_attr = {3644	.attr = {3645		 .name = "adapter_id",3646		 .mode = S_IRUGO,3647		 },3648	.show = pmcraid_show_adapter_id,3649};3650 3651static struct attribute *pmcraid_host_attrs[] = {3652	&pmcraid_log_level_attr.attr,3653	&pmcraid_driver_version_attr.attr,3654	&pmcraid_adapter_id_attr.attr,3655	NULL,3656};3657 3658ATTRIBUTE_GROUPS(pmcraid_host);3659 3660/* host template structure for pmcraid driver */3661static const struct scsi_host_template pmcraid_host_template = {3662	.module = THIS_MODULE,3663	.name = PMCRAID_DRIVER_NAME,3664	.queuecommand = pmcraid_queuecommand,3665	.eh_abort_handler = pmcraid_eh_abort_handler,3666	.eh_bus_reset_handler = pmcraid_eh_bus_reset_handler,3667	.eh_target_reset_handler = pmcraid_eh_target_reset_handler,3668	.eh_device_reset_handler = pmcraid_eh_device_reset_handler,3669	.eh_host_reset_handler = pmcraid_eh_host_reset_handler,3670 3671	.slave_alloc = pmcraid_slave_alloc,3672	.device_configure = pmcraid_device_configure,3673	.slave_destroy = pmcraid_slave_destroy,3674	.change_queue_depth = pmcraid_change_queue_depth,3675	.can_queue = PMCRAID_MAX_IO_CMD,3676	.this_id = -1,3677	.sg_tablesize = PMCRAID_MAX_IOADLS,3678	.max_sectors = PMCRAID_IOA_MAX_SECTORS,3679	.no_write_same = 1,3680	.cmd_per_lun = PMCRAID_MAX_CMD_PER_LUN,3681	.shost_groups = pmcraid_host_groups,3682	.proc_name = PMCRAID_DRIVER_NAME,3683};3684 3685/*3686 * pmcraid_isr_msix - implements MSI-X interrupt handling routine3687 * @irq: interrupt vector number3688 * @dev_id: pointer hrrq_vector3689 *3690 * Return Value3691 *	 IRQ_HANDLED if interrupt is handled or IRQ_NONE if ignored3692 */3693 3694static irqreturn_t pmcraid_isr_msix(int irq, void *dev_id)3695{3696	struct pmcraid_isr_param *hrrq_vector;3697	struct pmcraid_instance *pinstance;3698	unsigned long lock_flags;3699	u32 intrs_val;3700	int hrrq_id;3701 3702	hrrq_vector = (struct pmcraid_isr_param *)dev_id;3703	hrrq_id = hrrq_vector->hrrq_id;3704	pinstance = hrrq_vector->drv_inst;3705 3706	if (!hrrq_id) {3707		/* Read the interrupt */3708		intrs_val = pmcraid_read_interrupts(pinstance);3709		if (intrs_val &&3710			((ioread32(pinstance->int_regs.host_ioa_interrupt_reg)3711			& DOORBELL_INTR_MSIX_CLR) == 0)) {3712			/* Any error interrupts including unit_check,3713			 * initiate IOA reset.In case of unit check indicate3714			 * to reset_sequence that IOA unit checked and prepare3715			 * for a dump during reset sequence3716			 */3717			if (intrs_val & PMCRAID_ERROR_INTERRUPTS) {3718				if (intrs_val & INTRS_IOA_UNIT_CHECK)3719					pinstance->ioa_unit_check = 1;3720 3721				pmcraid_err("ISR: error interrupts: %x \3722					initiating reset\n", intrs_val);3723				spin_lock_irqsave(pinstance->host->host_lock,3724					lock_flags);3725				pmcraid_initiate_reset(pinstance);3726				spin_unlock_irqrestore(3727					pinstance->host->host_lock,3728					lock_flags);3729			}3730			/* If interrupt was as part of the ioa initialization,3731			 * clear it. Delete the timer and wakeup the3732			 * reset engine to proceed with reset sequence3733			 */3734			if (intrs_val & INTRS_TRANSITION_TO_OPERATIONAL)3735				pmcraid_clr_trans_op(pinstance);3736 3737			/* Clear the interrupt register by writing3738			 * to host to ioa doorbell. Once done3739			 * FW will clear the interrupt.3740			 */3741			iowrite32(DOORBELL_INTR_MSIX_CLR,3742				pinstance->int_regs.host_ioa_interrupt_reg);3743			ioread32(pinstance->int_regs.host_ioa_interrupt_reg);3744 3745 3746		}3747	}3748 3749	tasklet_schedule(&(pinstance->isr_tasklet[hrrq_id]));3750 3751	return IRQ_HANDLED;3752}3753 3754/**3755 * pmcraid_isr  - implements legacy interrupt handling routine3756 *3757 * @irq: interrupt vector number3758 * @dev_id: pointer hrrq_vector3759 *3760 * Return Value3761 *	 IRQ_HANDLED if interrupt is handled or IRQ_NONE if ignored3762 */3763static irqreturn_t pmcraid_isr(int irq, void *dev_id)3764{3765	struct pmcraid_isr_param *hrrq_vector;3766	struct pmcraid_instance *pinstance;3767	u32 intrs;3768	unsigned long lock_flags;3769	int hrrq_id = 0;3770 3771	/* In case of legacy interrupt mode where interrupts are shared across3772	 * isrs, it may be possible that the current interrupt is not from IOA3773	 */3774	if (!dev_id) {3775		printk(KERN_INFO "%s(): NULL host pointer\n", __func__);3776		return IRQ_NONE;3777	}3778	hrrq_vector = (struct pmcraid_isr_param *)dev_id;3779	pinstance = hrrq_vector->drv_inst;3780 3781	intrs = pmcraid_read_interrupts(pinstance);3782 3783	if (unlikely((intrs & PMCRAID_PCI_INTERRUPTS) == 0))3784		return IRQ_NONE;3785 3786	/* Any error interrupts including unit_check, initiate IOA reset.3787	 * In case of unit check indicate to reset_sequence that IOA unit3788	 * checked and prepare for a dump during reset sequence3789	 */3790	if (intrs & PMCRAID_ERROR_INTERRUPTS) {3791 3792		if (intrs & INTRS_IOA_UNIT_CHECK)3793			pinstance->ioa_unit_check = 1;3794 3795		iowrite32(intrs,3796			  pinstance->int_regs.ioa_host_interrupt_clr_reg);3797		pmcraid_err("ISR: error interrupts: %x initiating reset\n",3798			    intrs);3799		intrs = ioread32(3800				pinstance->int_regs.ioa_host_interrupt_clr_reg);3801		spin_lock_irqsave(pinstance->host->host_lock, lock_flags);3802		pmcraid_initiate_reset(pinstance);3803		spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);3804	} else {3805		/* If interrupt was as part of the ioa initialization,3806		 * clear. Delete the timer and wakeup the3807		 * reset engine to proceed with reset sequence3808		 */3809		if (intrs & INTRS_TRANSITION_TO_OPERATIONAL) {3810			pmcraid_clr_trans_op(pinstance);3811		} else {3812			iowrite32(intrs,3813				pinstance->int_regs.ioa_host_interrupt_clr_reg);3814			ioread32(3815				pinstance->int_regs.ioa_host_interrupt_clr_reg);3816 3817			tasklet_schedule(3818					&(pinstance->isr_tasklet[hrrq_id]));3819		}3820	}3821 3822	return IRQ_HANDLED;3823}3824 3825 3826/**3827 * pmcraid_worker_function -  worker thread function3828 *3829 * @workp: pointer to struct work queue3830 *3831 * Return Value3832 *	 None3833 */3834 3835static void pmcraid_worker_function(struct work_struct *workp)3836{3837	struct pmcraid_instance *pinstance;3838	struct pmcraid_resource_entry *res;3839	struct pmcraid_resource_entry *temp;3840	struct scsi_device *sdev;3841	unsigned long lock_flags;3842	unsigned long host_lock_flags;3843	u16 fw_version;3844	u8 bus, target, lun;3845 3846	pinstance = container_of(workp, struct pmcraid_instance, worker_q);3847	/* add resources only after host is added into system */3848	if (!atomic_read(&pinstance->expose_resources))3849		return;3850 3851	fw_version = be16_to_cpu(pinstance->inq_data->fw_version);3852 3853	spin_lock_irqsave(&pinstance->resource_lock, lock_flags);3854	list_for_each_entry_safe(res, temp, &pinstance->used_res_q, queue) {3855 3856		if (res->change_detected == RES_CHANGE_DEL && res->scsi_dev) {3857			sdev = res->scsi_dev;3858 3859			/* host_lock must be held before calling3860			 * scsi_device_get3861			 */3862			spin_lock_irqsave(pinstance->host->host_lock,3863					  host_lock_flags);3864			if (!scsi_device_get(sdev)) {3865				spin_unlock_irqrestore(3866						pinstance->host->host_lock,3867						host_lock_flags);3868				pmcraid_info("deleting %x from midlayer\n",3869					     res->cfg_entry.resource_address);3870				list_move_tail(&res->queue,3871						&pinstance->free_res_q);3872				spin_unlock_irqrestore(3873					&pinstance->resource_lock,3874					lock_flags);3875				scsi_remove_device(sdev);3876				scsi_device_put(sdev);3877				spin_lock_irqsave(&pinstance->resource_lock,3878						   lock_flags);3879				res->change_detected = 0;3880			} else {3881				spin_unlock_irqrestore(3882						pinstance->host->host_lock,3883						host_lock_flags);3884			}3885		}3886	}3887 3888	list_for_each_entry(res, &pinstance->used_res_q, queue) {3889 3890		if (res->change_detected == RES_CHANGE_ADD) {3891 3892			if (!pmcraid_expose_resource(fw_version,3893						     &res->cfg_entry))3894				continue;3895 3896			if (RES_IS_VSET(res->cfg_entry)) {3897				bus = PMCRAID_VSET_BUS_ID;3898				if (fw_version <= PMCRAID_FW_VERSION_1)3899					target = res->cfg_entry.unique_flags1;3900				else3901					target = le16_to_cpu(res->cfg_entry.array_id) & 0xFF;3902				lun = PMCRAID_VSET_LUN_ID;3903			} else {3904				bus = PMCRAID_PHYS_BUS_ID;3905				target =3906				     RES_TARGET(3907					res->cfg_entry.resource_address);3908				lun = RES_LUN(res->cfg_entry.resource_address);3909			}3910 3911			res->change_detected = 0;3912			spin_unlock_irqrestore(&pinstance->resource_lock,3913						lock_flags);3914			scsi_add_device(pinstance->host, bus, target, lun);3915			spin_lock_irqsave(&pinstance->resource_lock,3916					   lock_flags);3917		}3918	}3919 3920	spin_unlock_irqrestore(&pinstance->resource_lock, lock_flags);3921}3922 3923/**3924 * pmcraid_tasklet_function - Tasklet function3925 *3926 * @instance: pointer to msix param structure3927 *3928 * Return Value3929 *	None3930 */3931static void pmcraid_tasklet_function(unsigned long instance)3932{3933	struct pmcraid_isr_param *hrrq_vector;3934	struct pmcraid_instance *pinstance;3935	unsigned long hrrq_lock_flags;3936	unsigned long pending_lock_flags;3937	unsigned long host_lock_flags;3938	spinlock_t *lockp; /* hrrq buffer lock */3939	int id;3940	u32 resp;3941 3942	hrrq_vector = (struct pmcraid_isr_param *)instance;3943	pinstance = hrrq_vector->drv_inst;3944	id = hrrq_vector->hrrq_id;3945	lockp = &(pinstance->hrrq_lock[id]);3946 3947	/* loop through each of the commands responded by IOA. Each HRRQ buf is3948	 * protected by its own lock. Traversals must be done within this lock3949	 * as there may be multiple tasklets running on multiple CPUs. Note3950	 * that the lock is held just for picking up the response handle and3951	 * manipulating hrrq_curr/toggle_bit values.3952	 */3953	spin_lock_irqsave(lockp, hrrq_lock_flags);3954 3955	resp = le32_to_cpu(*(pinstance->hrrq_curr[id]));3956 3957	while ((resp & HRRQ_TOGGLE_BIT) ==3958		pinstance->host_toggle_bit[id]) {3959 3960		int cmd_index = resp >> 2;3961		struct pmcraid_cmd *cmd = NULL;3962 3963		if (pinstance->hrrq_curr[id] < pinstance->hrrq_end[id]) {3964			pinstance->hrrq_curr[id]++;3965		} else {3966			pinstance->hrrq_curr[id] = pinstance->hrrq_start[id];3967			pinstance->host_toggle_bit[id] ^= 1u;3968		}3969 3970		if (cmd_index >= PMCRAID_MAX_CMD) {3971			/* In case of invalid response handle, log message */3972			pmcraid_err("Invalid response handle %d\n", cmd_index);3973			resp = le32_to_cpu(*(pinstance->hrrq_curr[id]));3974			continue;3975		}3976 3977		cmd = pinstance->cmd_list[cmd_index];3978		spin_unlock_irqrestore(lockp, hrrq_lock_flags);3979 3980		spin_lock_irqsave(&pinstance->pending_pool_lock,3981				   pending_lock_flags);3982		list_del(&cmd->free_list);3983		spin_unlock_irqrestore(&pinstance->pending_pool_lock,3984					pending_lock_flags);3985		del_timer(&cmd->timer);3986		atomic_dec(&pinstance->outstanding_cmds);3987 3988		if (cmd->cmd_done == pmcraid_ioa_reset) {3989			spin_lock_irqsave(pinstance->host->host_lock,3990					  host_lock_flags);3991			cmd->cmd_done(cmd);3992			spin_unlock_irqrestore(pinstance->host->host_lock,3993					       host_lock_flags);3994		} else if (cmd->cmd_done != NULL) {3995			cmd->cmd_done(cmd);3996		}3997		/* loop over until we are done with all responses */3998		spin_lock_irqsave(lockp, hrrq_lock_flags);3999		resp = le32_to_cpu(*(pinstance->hrrq_curr[id]));4000	}4001 4002	spin_unlock_irqrestore(lockp, hrrq_lock_flags);4003}4004 4005/**4006 * pmcraid_unregister_interrupt_handler - de-register interrupts handlers4007 * @pinstance: pointer to adapter instance structure4008 *4009 * This routine un-registers registered interrupt handler and4010 * also frees irqs/vectors.4011 *4012 * Return Value4013 *	None4014 */4015static4016void pmcraid_unregister_interrupt_handler(struct pmcraid_instance *pinstance)4017{4018	struct pci_dev *pdev = pinstance->pdev;4019	int i;4020 4021	for (i = 0; i < pinstance->num_hrrq; i++)4022		free_irq(pci_irq_vector(pdev, i), &pinstance->hrrq_vector[i]);4023 4024	pinstance->interrupt_mode = 0;4025	pci_free_irq_vectors(pdev);4026}4027 4028/**4029 * pmcraid_register_interrupt_handler - registers interrupt handler4030 * @pinstance: pointer to per-adapter instance structure4031 *4032 * Return Value4033 *	0 on success, non-zero error code otherwise.4034 */4035static int4036pmcraid_register_interrupt_handler(struct pmcraid_instance *pinstance)4037{4038	struct pci_dev *pdev = pinstance->pdev;4039	unsigned int irq_flag = PCI_IRQ_INTX, flag;4040	int num_hrrq, rc, i;4041	irq_handler_t isr;4042 4043	if (pmcraid_enable_msix)4044		irq_flag |= PCI_IRQ_MSIX;4045 4046	num_hrrq = pci_alloc_irq_vectors(pdev, 1, PMCRAID_NUM_MSIX_VECTORS,4047			irq_flag);4048	if (num_hrrq < 0)4049		return num_hrrq;4050 4051	if (pdev->msix_enabled) {4052		flag = 0;4053		isr = pmcraid_isr_msix;4054	} else {4055		flag = IRQF_SHARED;4056		isr = pmcraid_isr;4057	}4058 4059	for (i = 0; i < num_hrrq; i++) {4060		struct pmcraid_isr_param *vec = &pinstance->hrrq_vector[i];4061 4062		vec->hrrq_id = i;4063		vec->drv_inst = pinstance;4064		rc = request_irq(pci_irq_vector(pdev, i), isr, flag,4065				PMCRAID_DRIVER_NAME, vec);4066		if (rc)4067			goto out_unwind;4068	}4069 4070	pinstance->num_hrrq = num_hrrq;4071	if (pdev->msix_enabled) {4072		pinstance->interrupt_mode = 1;4073		iowrite32(DOORBELL_INTR_MODE_MSIX,4074			  pinstance->int_regs.host_ioa_interrupt_reg);4075		ioread32(pinstance->int_regs.host_ioa_interrupt_reg);4076	}4077 4078	return 0;4079 4080out_unwind:4081	while (--i >= 0)4082		free_irq(pci_irq_vector(pdev, i), &pinstance->hrrq_vector[i]);4083	pci_free_irq_vectors(pdev);4084	return rc;4085}4086 4087/**4088 * pmcraid_release_cmd_blocks - release buufers allocated for command blocks4089 * @pinstance: per adapter instance structure pointer4090 * @max_index: number of buffer blocks to release4091 *4092 * Return Value4093 *  None4094 */4095static void4096pmcraid_release_cmd_blocks(struct pmcraid_instance *pinstance, int max_index)4097{4098	int i;4099	for (i = 0; i < max_index; i++) {4100		kmem_cache_free(pinstance->cmd_cachep, pinstance->cmd_list[i]);4101		pinstance->cmd_list[i] = NULL;4102	}4103	kmem_cache_destroy(pinstance->cmd_cachep);4104	pinstance->cmd_cachep = NULL;4105}4106 4107/**4108 * pmcraid_release_control_blocks - releases buffers alloced for control blocks4109 * @pinstance: pointer to per adapter instance structure4110 * @max_index: number of buffers (from 0 onwards) to release4111 *4112 * This function assumes that the command blocks for which control blocks are4113 * linked are not released.4114 *4115 * Return Value4116 *	 None4117 */4118static void4119pmcraid_release_control_blocks(4120	struct pmcraid_instance *pinstance,4121	int max_index4122)4123{4124	int i;4125 4126	if (pinstance->control_pool == NULL)4127		return;4128 4129	for (i = 0; i < max_index; i++) {4130		dma_pool_free(pinstance->control_pool,4131			      pinstance->cmd_list[i]->ioa_cb,4132			      pinstance->cmd_list[i]->ioa_cb_bus_addr);4133		pinstance->cmd_list[i]->ioa_cb = NULL;4134		pinstance->cmd_list[i]->ioa_cb_bus_addr = 0;4135	}4136	dma_pool_destroy(pinstance->control_pool);4137	pinstance->control_pool = NULL;4138}4139 4140/**4141 * pmcraid_allocate_cmd_blocks - allocate memory for cmd block structures4142 * @pinstance: pointer to per adapter instance structure4143 *4144 * Allocates memory for command blocks using kernel slab allocator.4145 *4146 * Return Value4147 *	0 in case of success; -ENOMEM in case of failure4148 */4149static int pmcraid_allocate_cmd_blocks(struct pmcraid_instance *pinstance)4150{4151	int i;4152 4153	sprintf(pinstance->cmd_pool_name, "pmcraid_cmd_pool_%d",4154		pinstance->host->unique_id);4155 4156 4157	pinstance->cmd_cachep = kmem_cache_create(4158					pinstance->cmd_pool_name,4159					sizeof(struct pmcraid_cmd), 0,4160					SLAB_HWCACHE_ALIGN, NULL);4161	if (!pinstance->cmd_cachep)4162		return -ENOMEM;4163 4164	for (i = 0; i < PMCRAID_MAX_CMD; i++) {4165		pinstance->cmd_list[i] =4166			kmem_cache_alloc(pinstance->cmd_cachep, GFP_KERNEL);4167		if (!pinstance->cmd_list[i]) {4168			pmcraid_release_cmd_blocks(pinstance, i);4169			return -ENOMEM;4170		}4171	}4172	return 0;4173}4174 4175/**4176 * pmcraid_allocate_control_blocks - allocates memory control blocks4177 * @pinstance : pointer to per adapter instance structure4178 *4179 * This function allocates PCI memory for DMAable buffers like IOARCB, IOADLs4180 * and IOASAs. This is called after command blocks are already allocated.4181 *4182 * Return Value4183 *  0 in case it can allocate all control blocks, otherwise -ENOMEM4184 */4185static int pmcraid_allocate_control_blocks(struct pmcraid_instance *pinstance)4186{4187	int i;4188 4189	sprintf(pinstance->ctl_pool_name, "pmcraid_control_pool_%d",4190		pinstance->host->unique_id);4191 4192	pinstance->control_pool =4193		dma_pool_create(pinstance->ctl_pool_name,4194				&pinstance->pdev->dev,4195				sizeof(struct pmcraid_control_block),4196				PMCRAID_IOARCB_ALIGNMENT, 0);4197 4198	if (!pinstance->control_pool)4199		return -ENOMEM;4200 4201	for (i = 0; i < PMCRAID_MAX_CMD; i++) {4202		pinstance->cmd_list[i]->ioa_cb =4203			dma_pool_zalloc(4204				pinstance->control_pool,4205				GFP_KERNEL,4206				&(pinstance->cmd_list[i]->ioa_cb_bus_addr));4207 4208		if (!pinstance->cmd_list[i]->ioa_cb) {4209			pmcraid_release_control_blocks(pinstance, i);4210			return -ENOMEM;4211		}4212	}4213	return 0;4214}4215 4216/**4217 * pmcraid_release_host_rrqs - release memory allocated for hrrq buffer(s)4218 * @pinstance: pointer to per adapter instance structure4219 * @maxindex: size of hrrq buffer pointer array4220 *4221 * Return Value4222 *	None4223 */4224static void4225pmcraid_release_host_rrqs(struct pmcraid_instance *pinstance, int maxindex)4226{4227	int i;4228 4229	for (i = 0; i < maxindex; i++) {4230		dma_free_coherent(&pinstance->pdev->dev,4231				    HRRQ_ENTRY_SIZE * PMCRAID_MAX_CMD,4232				    pinstance->hrrq_start[i],4233				    pinstance->hrrq_start_bus_addr[i]);4234 4235		/* reset pointers and toggle bit to zeros */4236		pinstance->hrrq_start[i] = NULL;4237		pinstance->hrrq_start_bus_addr[i] = 0;4238		pinstance->host_toggle_bit[i] = 0;4239	}4240}4241 4242/**4243 * pmcraid_allocate_host_rrqs - Allocate and initialize host RRQ buffers4244 * @pinstance: pointer to per adapter instance structure4245 *4246 * Return value4247 *	0 hrrq buffers are allocated, -ENOMEM otherwise.4248 */4249static int pmcraid_allocate_host_rrqs(struct pmcraid_instance *pinstance)4250{4251	int i, buffer_size;4252 4253	buffer_size = HRRQ_ENTRY_SIZE * PMCRAID_MAX_CMD;4254 4255	for (i = 0; i < pinstance->num_hrrq; i++) {4256		pinstance->hrrq_start[i] =4257			dma_alloc_coherent(&pinstance->pdev->dev, buffer_size,4258					   &pinstance->hrrq_start_bus_addr[i],4259					   GFP_KERNEL);4260		if (!pinstance->hrrq_start[i]) {4261			pmcraid_err("pci_alloc failed for hrrq vector : %d\n",4262				    i);4263			pmcraid_release_host_rrqs(pinstance, i);4264			return -ENOMEM;4265		}4266 4267		pinstance->hrrq_curr[i] = pinstance->hrrq_start[i];4268		pinstance->hrrq_end[i] =4269			pinstance->hrrq_start[i] + PMCRAID_MAX_CMD - 1;4270		pinstance->host_toggle_bit[i] = 1;4271		spin_lock_init(&pinstance->hrrq_lock[i]);4272	}4273	return 0;4274}4275 4276/**4277 * pmcraid_release_hcams - release HCAM buffers4278 *4279 * @pinstance: pointer to per adapter instance structure4280 *4281 * Return value4282 *  none4283 */4284static void pmcraid_release_hcams(struct pmcraid_instance *pinstance)4285{4286	if (pinstance->ccn.msg != NULL) {4287		dma_free_coherent(&pinstance->pdev->dev,4288				    PMCRAID_AEN_HDR_SIZE +4289				    sizeof(struct pmcraid_hcam_ccn_ext),4290				    pinstance->ccn.msg,4291				    pinstance->ccn.baddr);4292 4293		pinstance->ccn.msg = NULL;4294		pinstance->ccn.hcam = NULL;4295		pinstance->ccn.baddr = 0;4296	}4297 4298	if (pinstance->ldn.msg != NULL) {4299		dma_free_coherent(&pinstance->pdev->dev,4300				    PMCRAID_AEN_HDR_SIZE +4301				    sizeof(struct pmcraid_hcam_ldn),4302				    pinstance->ldn.msg,4303				    pinstance->ldn.baddr);4304 4305		pinstance->ldn.msg = NULL;4306		pinstance->ldn.hcam = NULL;4307		pinstance->ldn.baddr = 0;4308	}4309}4310 4311/**4312 * pmcraid_allocate_hcams - allocates HCAM buffers4313 * @pinstance : pointer to per adapter instance structure4314 *4315 * Return Value:4316 *   0 in case of successful allocation, non-zero otherwise4317 */4318static int pmcraid_allocate_hcams(struct pmcraid_instance *pinstance)4319{4320	pinstance->ccn.msg = dma_alloc_coherent(&pinstance->pdev->dev,4321					PMCRAID_AEN_HDR_SIZE +4322					sizeof(struct pmcraid_hcam_ccn_ext),4323					&pinstance->ccn.baddr, GFP_KERNEL);4324 4325	pinstance->ldn.msg = dma_alloc_coherent(&pinstance->pdev->dev,4326					PMCRAID_AEN_HDR_SIZE +4327					sizeof(struct pmcraid_hcam_ldn),4328					&pinstance->ldn.baddr, GFP_KERNEL);4329 4330	if (pinstance->ldn.msg == NULL || pinstance->ccn.msg == NULL) {4331		pmcraid_release_hcams(pinstance);4332	} else {4333		pinstance->ccn.hcam =4334			(void *)pinstance->ccn.msg + PMCRAID_AEN_HDR_SIZE;4335		pinstance->ldn.hcam =4336			(void *)pinstance->ldn.msg + PMCRAID_AEN_HDR_SIZE;4337 4338		atomic_set(&pinstance->ccn.ignore, 0);4339		atomic_set(&pinstance->ldn.ignore, 0);4340	}4341 4342	return (pinstance->ldn.msg == NULL) ? -ENOMEM : 0;4343}4344 4345/**4346 * pmcraid_release_config_buffers - release config.table buffers4347 * @pinstance: pointer to per adapter instance structure4348 *4349 * Return Value4350 *	 none4351 */4352static void pmcraid_release_config_buffers(struct pmcraid_instance *pinstance)4353{4354	if (pinstance->cfg_table != NULL &&4355	    pinstance->cfg_table_bus_addr != 0) {4356		dma_free_coherent(&pinstance->pdev->dev,4357				    sizeof(struct pmcraid_config_table),4358				    pinstance->cfg_table,4359				    pinstance->cfg_table_bus_addr);4360		pinstance->cfg_table = NULL;4361		pinstance->cfg_table_bus_addr = 0;4362	}4363 4364	if (pinstance->res_entries != NULL) {4365		int i;4366 4367		for (i = 0; i < PMCRAID_MAX_RESOURCES; i++)4368			list_del(&pinstance->res_entries[i].queue);4369		kfree(pinstance->res_entries);4370		pinstance->res_entries = NULL;4371	}4372 4373	pmcraid_release_hcams(pinstance);4374}4375 4376/**4377 * pmcraid_allocate_config_buffers - allocates DMAable memory for config table4378 * @pinstance : pointer to per adapter instance structure4379 *4380 * Return Value4381 *	0 for successful allocation, -ENOMEM for any failure4382 */4383static int pmcraid_allocate_config_buffers(struct pmcraid_instance *pinstance)4384{4385	int i;4386 4387	pinstance->res_entries =4388			kcalloc(PMCRAID_MAX_RESOURCES,4389				sizeof(struct pmcraid_resource_entry),4390				GFP_KERNEL);4391 4392	if (NULL == pinstance->res_entries) {4393		pmcraid_err("failed to allocate memory for resource table\n");4394		return -ENOMEM;4395	}4396 4397	for (i = 0; i < PMCRAID_MAX_RESOURCES; i++)4398		list_add_tail(&pinstance->res_entries[i].queue,4399			      &pinstance->free_res_q);4400 4401	pinstance->cfg_table = dma_alloc_coherent(&pinstance->pdev->dev,4402				     sizeof(struct pmcraid_config_table),4403				     &pinstance->cfg_table_bus_addr,4404				     GFP_KERNEL);4405 4406	if (NULL == pinstance->cfg_table) {4407		pmcraid_err("couldn't alloc DMA memory for config table\n");4408		pmcraid_release_config_buffers(pinstance);4409		return -ENOMEM;4410	}4411 4412	if (pmcraid_allocate_hcams(pinstance)) {4413		pmcraid_err("could not alloc DMA memory for HCAMS\n");4414		pmcraid_release_config_buffers(pinstance);4415		return -ENOMEM;4416	}4417 4418	return 0;4419}4420 4421/**4422 * pmcraid_init_tasklets - registers tasklets for response handling4423 *4424 * @pinstance: pointer adapter instance structure4425 *4426 * Return value4427 *	none4428 */4429static void pmcraid_init_tasklets(struct pmcraid_instance *pinstance)4430{4431	int i;4432	for (i = 0; i < pinstance->num_hrrq; i++)4433		tasklet_init(&pinstance->isr_tasklet[i],4434			     pmcraid_tasklet_function,4435			     (unsigned long)&pinstance->hrrq_vector[i]);4436}4437 4438/**4439 * pmcraid_kill_tasklets - destroys tasklets registered for response handling4440 *4441 * @pinstance: pointer to adapter instance structure4442 *4443 * Return value4444 *	none4445 */4446static void pmcraid_kill_tasklets(struct pmcraid_instance *pinstance)4447{4448	int i;4449	for (i = 0; i < pinstance->num_hrrq; i++)4450		tasklet_kill(&pinstance->isr_tasklet[i]);4451}4452 4453/**4454 * pmcraid_release_buffers - release per-adapter buffers allocated4455 *4456 * @pinstance: pointer to adapter soft state4457 *4458 * Return Value4459 *	none4460 */4461static void pmcraid_release_buffers(struct pmcraid_instance *pinstance)4462{4463	pmcraid_release_config_buffers(pinstance);4464	pmcraid_release_control_blocks(pinstance, PMCRAID_MAX_CMD);4465	pmcraid_release_cmd_blocks(pinstance, PMCRAID_MAX_CMD);4466	pmcraid_release_host_rrqs(pinstance, pinstance->num_hrrq);4467 4468	if (pinstance->inq_data != NULL) {4469		dma_free_coherent(&pinstance->pdev->dev,4470				    sizeof(struct pmcraid_inquiry_data),4471				    pinstance->inq_data,4472				    pinstance->inq_data_baddr);4473 4474		pinstance->inq_data = NULL;4475		pinstance->inq_data_baddr = 0;4476	}4477 4478	if (pinstance->timestamp_data != NULL) {4479		dma_free_coherent(&pinstance->pdev->dev,4480				    sizeof(struct pmcraid_timestamp_data),4481				    pinstance->timestamp_data,4482				    pinstance->timestamp_data_baddr);4483 4484		pinstance->timestamp_data = NULL;4485		pinstance->timestamp_data_baddr = 0;4486	}4487}4488 4489/**4490 * pmcraid_init_buffers - allocates memory and initializes various structures4491 * @pinstance: pointer to per adapter instance structure4492 *4493 * This routine pre-allocates memory based on the type of block as below:4494 * cmdblocks(PMCRAID_MAX_CMD): kernel memory using kernel's slab_allocator,4495 * IOARCBs(PMCRAID_MAX_CMD)  : DMAable memory, using pci pool allocator4496 * config-table entries      : DMAable memory using dma_alloc_coherent4497 * HostRRQs                  : DMAable memory, using dma_alloc_coherent4498 *4499 * Return Value4500 *	 0 in case all of the blocks are allocated, -ENOMEM otherwise.4501 */4502static int pmcraid_init_buffers(struct pmcraid_instance *pinstance)4503{4504	int i;4505 4506	if (pmcraid_allocate_host_rrqs(pinstance)) {4507		pmcraid_err("couldn't allocate memory for %d host rrqs\n",4508			     pinstance->num_hrrq);4509		return -ENOMEM;4510	}4511 4512	if (pmcraid_allocate_config_buffers(pinstance)) {4513		pmcraid_err("couldn't allocate memory for config buffers\n");4514		pmcraid_release_host_rrqs(pinstance, pinstance->num_hrrq);4515		return -ENOMEM;4516	}4517 4518	if (pmcraid_allocate_cmd_blocks(pinstance)) {4519		pmcraid_err("couldn't allocate memory for cmd blocks\n");4520		pmcraid_release_config_buffers(pinstance);4521		pmcraid_release_host_rrqs(pinstance, pinstance->num_hrrq);4522		return -ENOMEM;4523	}4524 4525	if (pmcraid_allocate_control_blocks(pinstance)) {4526		pmcraid_err("couldn't allocate memory control blocks\n");4527		pmcraid_release_config_buffers(pinstance);4528		pmcraid_release_cmd_blocks(pinstance, PMCRAID_MAX_CMD);4529		pmcraid_release_host_rrqs(pinstance, pinstance->num_hrrq);4530		return -ENOMEM;4531	}4532 4533	/* allocate DMAable memory for page D0 INQUIRY buffer */4534	pinstance->inq_data = dma_alloc_coherent(&pinstance->pdev->dev,4535					sizeof(struct pmcraid_inquiry_data),4536					&pinstance->inq_data_baddr, GFP_KERNEL);4537	if (pinstance->inq_data == NULL) {4538		pmcraid_err("couldn't allocate DMA memory for INQUIRY\n");4539		pmcraid_release_buffers(pinstance);4540		return -ENOMEM;4541	}4542 4543	/* allocate DMAable memory for set timestamp data buffer */4544	pinstance->timestamp_data = dma_alloc_coherent(&pinstance->pdev->dev,4545					sizeof(struct pmcraid_timestamp_data),4546					&pinstance->timestamp_data_baddr,4547					GFP_KERNEL);4548	if (pinstance->timestamp_data == NULL) {4549		pmcraid_err("couldn't allocate DMA memory for \4550				set time_stamp \n");4551		pmcraid_release_buffers(pinstance);4552		return -ENOMEM;4553	}4554 4555 4556	/* Initialize all the command blocks and add them to free pool. No4557	 * need to lock (free_pool_lock) as this is done in initialization4558	 * itself4559	 */4560	for (i = 0; i < PMCRAID_MAX_CMD; i++) {4561		struct pmcraid_cmd *cmdp = pinstance->cmd_list[i];4562		pmcraid_init_cmdblk(cmdp, i);4563		cmdp->drv_inst = pinstance;4564		list_add_tail(&cmdp->free_list, &pinstance->free_cmd_pool);4565	}4566 4567	return 0;4568}4569 4570/**4571 * pmcraid_reinit_buffers - resets various buffer pointers4572 * @pinstance: pointer to adapter instance4573 * Return value4574 *	none4575 */4576static void pmcraid_reinit_buffers(struct pmcraid_instance *pinstance)4577{4578	int i;4579	int buffer_size = HRRQ_ENTRY_SIZE * PMCRAID_MAX_CMD;4580 4581	for (i = 0; i < pinstance->num_hrrq; i++) {4582		memset(pinstance->hrrq_start[i], 0, buffer_size);4583		pinstance->hrrq_curr[i] = pinstance->hrrq_start[i];4584		pinstance->hrrq_end[i] =4585			pinstance->hrrq_start[i] + PMCRAID_MAX_CMD - 1;4586		pinstance->host_toggle_bit[i] = 1;4587	}4588}4589 4590/**4591 * pmcraid_init_instance - initialize per instance data structure4592 * @pdev: pointer to pci device structure4593 * @host: pointer to Scsi_Host structure4594 * @mapped_pci_addr: memory mapped IOA configuration registers4595 *4596 * Return Value4597 *	 0 on success, non-zero in case of any failure4598 */4599static int pmcraid_init_instance(struct pci_dev *pdev, struct Scsi_Host *host,4600				 void __iomem *mapped_pci_addr)4601{4602	struct pmcraid_instance *pinstance =4603		(struct pmcraid_instance *)host->hostdata;4604 4605	pinstance->host = host;4606	pinstance->pdev = pdev;4607 4608	/* Initialize register addresses */4609	pinstance->mapped_dma_addr = mapped_pci_addr;4610 4611	/* Initialize chip-specific details */4612	{4613		struct pmcraid_chip_details *chip_cfg = pinstance->chip_cfg;4614		struct pmcraid_interrupts *pint_regs = &pinstance->int_regs;4615 4616		pinstance->ioarrin = mapped_pci_addr + chip_cfg->ioarrin;4617 4618		pint_regs->ioa_host_interrupt_reg =4619			mapped_pci_addr + chip_cfg->ioa_host_intr;4620		pint_regs->ioa_host_interrupt_clr_reg =4621			mapped_pci_addr + chip_cfg->ioa_host_intr_clr;4622		pint_regs->ioa_host_msix_interrupt_reg =4623			mapped_pci_addr + chip_cfg->ioa_host_msix_intr;4624		pint_regs->host_ioa_interrupt_reg =4625			mapped_pci_addr + chip_cfg->host_ioa_intr;4626		pint_regs->host_ioa_interrupt_clr_reg =4627			mapped_pci_addr + chip_cfg->host_ioa_intr_clr;4628 4629		/* Current version of firmware exposes interrupt mask set4630		 * and mask clr registers through memory mapped bar0.4631		 */4632		pinstance->mailbox = mapped_pci_addr + chip_cfg->mailbox;4633		pinstance->ioa_status = mapped_pci_addr + chip_cfg->ioastatus;4634		pint_regs->ioa_host_interrupt_mask_reg =4635			mapped_pci_addr + chip_cfg->ioa_host_mask;4636		pint_regs->ioa_host_interrupt_mask_clr_reg =4637			mapped_pci_addr + chip_cfg->ioa_host_mask_clr;4638		pint_regs->global_interrupt_mask_reg =4639			mapped_pci_addr + chip_cfg->global_intr_mask;4640	}4641 4642	pinstance->ioa_reset_attempts = 0;4643	init_waitqueue_head(&pinstance->reset_wait_q);4644 4645	atomic_set(&pinstance->outstanding_cmds, 0);4646	atomic_set(&pinstance->last_message_id, 0);4647	atomic_set(&pinstance->expose_resources, 0);4648 4649	INIT_LIST_HEAD(&pinstance->free_res_q);4650	INIT_LIST_HEAD(&pinstance->used_res_q);4651	INIT_LIST_HEAD(&pinstance->free_cmd_pool);4652	INIT_LIST_HEAD(&pinstance->pending_cmd_pool);4653 4654	spin_lock_init(&pinstance->free_pool_lock);4655	spin_lock_init(&pinstance->pending_pool_lock);4656	spin_lock_init(&pinstance->resource_lock);4657	mutex_init(&pinstance->aen_queue_lock);4658 4659	/* Work-queue (Shared) for deferred processing error handling */4660	INIT_WORK(&pinstance->worker_q, pmcraid_worker_function);4661 4662	/* Initialize the default log_level */4663	pinstance->current_log_level = pmcraid_log_level;4664 4665	/* Setup variables required for reset engine */4666	pinstance->ioa_state = IOA_STATE_UNKNOWN;4667	pinstance->reset_cmd = NULL;4668	return 0;4669}4670 4671/**4672 * pmcraid_shutdown - shutdown adapter controller.4673 * @pdev: pci device struct4674 *4675 * Issues an adapter shutdown to the card waits for its completion4676 *4677 * Return value4678 *	  none4679 */4680static void pmcraid_shutdown(struct pci_dev *pdev)4681{4682	struct pmcraid_instance *pinstance = pci_get_drvdata(pdev);4683	pmcraid_reset_bringdown(pinstance);4684}4685 4686 4687/*4688 * pmcraid_get_minor - returns unused minor number from minor number bitmap4689 */4690static unsigned short pmcraid_get_minor(void)4691{4692	int minor;4693 4694	minor = find_first_zero_bit(pmcraid_minor, PMCRAID_MAX_ADAPTERS);4695	__set_bit(minor, pmcraid_minor);4696	return minor;4697}4698 4699/*4700 * pmcraid_release_minor - releases given minor back to minor number bitmap4701 */4702static void pmcraid_release_minor(unsigned short minor)4703{4704	__clear_bit(minor, pmcraid_minor);4705}4706 4707/**4708 * pmcraid_setup_chrdev - allocates a minor number and registers a char device4709 *4710 * @pinstance: pointer to adapter instance for which to register device4711 *4712 * Return value4713 *	0 in case of success, otherwise non-zero4714 */4715static int pmcraid_setup_chrdev(struct pmcraid_instance *pinstance)4716{4717	int minor;4718	int error;4719 4720	minor = pmcraid_get_minor();4721	cdev_init(&pinstance->cdev, &pmcraid_fops);4722	pinstance->cdev.owner = THIS_MODULE;4723 4724	error = cdev_add(&pinstance->cdev, MKDEV(pmcraid_major, minor), 1);4725 4726	if (error)4727		pmcraid_release_minor(minor);4728	else4729		device_create(&pmcraid_class, NULL, MKDEV(pmcraid_major, minor),4730			      NULL, "%s%u", PMCRAID_DEVFILE, minor);4731	return error;4732}4733 4734/**4735 * pmcraid_release_chrdev - unregisters per-adapter management interface4736 *4737 * @pinstance: pointer to adapter instance structure4738 *4739 * Return value4740 *  none4741 */4742static void pmcraid_release_chrdev(struct pmcraid_instance *pinstance)4743{4744	pmcraid_release_minor(MINOR(pinstance->cdev.dev));4745	device_destroy(&pmcraid_class,4746		       MKDEV(pmcraid_major, MINOR(pinstance->cdev.dev)));4747	cdev_del(&pinstance->cdev);4748}4749 4750/**4751 * pmcraid_remove - IOA hot plug remove entry point4752 * @pdev: pci device struct4753 *4754 * Return value4755 *	  none4756 */4757static void pmcraid_remove(struct pci_dev *pdev)4758{4759	struct pmcraid_instance *pinstance = pci_get_drvdata(pdev);4760 4761	/* remove the management interface (/dev file) for this device */4762	pmcraid_release_chrdev(pinstance);4763 4764	/* remove host template from scsi midlayer */4765	scsi_remove_host(pinstance->host);4766 4767	/* block requests from mid-layer */4768	scsi_block_requests(pinstance->host);4769 4770	/* initiate shutdown adapter */4771	pmcraid_shutdown(pdev);4772 4773	pmcraid_disable_interrupts(pinstance, ~0);4774	flush_work(&pinstance->worker_q);4775 4776	pmcraid_kill_tasklets(pinstance);4777	pmcraid_unregister_interrupt_handler(pinstance);4778	pmcraid_release_buffers(pinstance);4779	iounmap(pinstance->mapped_dma_addr);4780	pci_release_regions(pdev);4781	scsi_host_put(pinstance->host);4782	pci_disable_device(pdev);4783 4784	return;4785}4786 4787/**4788 * pmcraid_suspend - driver suspend entry point for power management4789 * @dev:   Device structure4790 *4791 * Return Value - 0 always4792 */4793static int __maybe_unused pmcraid_suspend(struct device *dev)4794{4795	struct pci_dev *pdev = to_pci_dev(dev);4796	struct pmcraid_instance *pinstance = pci_get_drvdata(pdev);4797 4798	pmcraid_shutdown(pdev);4799	pmcraid_disable_interrupts(pinstance, ~0);4800	pmcraid_kill_tasklets(pinstance);4801	pmcraid_unregister_interrupt_handler(pinstance);4802 4803	return 0;4804}4805 4806/**4807 * pmcraid_resume - driver resume entry point PCI power management4808 * @dev: Device structure4809 *4810 * Return Value - 0 in case of success. Error code in case of any failure4811 */4812static int __maybe_unused pmcraid_resume(struct device *dev)4813{4814	struct pci_dev *pdev = to_pci_dev(dev);4815	struct pmcraid_instance *pinstance = pci_get_drvdata(pdev);4816	struct Scsi_Host *host = pinstance->host;4817	int rc = 0;4818 4819	if (sizeof(dma_addr_t) == 4 ||4820	    dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)))4821		rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));4822 4823	if (rc == 0)4824		rc = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));4825 4826	if (rc != 0) {4827		dev_err(&pdev->dev, "resume: Failed to set PCI DMA mask\n");4828		goto disable_device;4829	}4830 4831	pmcraid_disable_interrupts(pinstance, ~0);4832	atomic_set(&pinstance->outstanding_cmds, 0);4833	rc = pmcraid_register_interrupt_handler(pinstance);4834 4835	if (rc) {4836		dev_err(&pdev->dev,4837			"resume: couldn't register interrupt handlers\n");4838		rc = -ENODEV;4839		goto release_host;4840	}4841 4842	pmcraid_init_tasklets(pinstance);4843	pmcraid_enable_interrupts(pinstance, PMCRAID_PCI_INTERRUPTS);4844 4845	/* Start with hard reset sequence which brings up IOA to operational4846	 * state as well as completes the reset sequence.4847	 */4848	pinstance->ioa_hard_reset = 1;4849 4850	/* Start IOA firmware initialization and bring card to Operational4851	 * state.4852	 */4853	if (pmcraid_reset_bringup(pinstance)) {4854		dev_err(&pdev->dev, "couldn't initialize IOA\n");4855		rc = -ENODEV;4856		goto release_tasklets;4857	}4858 4859	return 0;4860 4861release_tasklets:4862	pmcraid_disable_interrupts(pinstance, ~0);4863	pmcraid_kill_tasklets(pinstance);4864	pmcraid_unregister_interrupt_handler(pinstance);4865 4866release_host:4867	scsi_host_put(host);4868 4869disable_device:4870 4871	return rc;4872}4873 4874/**4875 * pmcraid_complete_ioa_reset - Called by either timer or tasklet during4876 *				completion of the ioa reset4877 * @cmd: pointer to reset command block4878 */4879static void pmcraid_complete_ioa_reset(struct pmcraid_cmd *cmd)4880{4881	struct pmcraid_instance *pinstance = cmd->drv_inst;4882	unsigned long flags;4883 4884	spin_lock_irqsave(pinstance->host->host_lock, flags);4885	pmcraid_ioa_reset(cmd);4886	spin_unlock_irqrestore(pinstance->host->host_lock, flags);4887	scsi_unblock_requests(pinstance->host);4888	schedule_work(&pinstance->worker_q);4889}4890 4891/**4892 * pmcraid_set_supported_devs - sends SET SUPPORTED DEVICES to IOAFP4893 *4894 * @cmd: pointer to pmcraid_cmd structure4895 *4896 * Return Value4897 *  0 for success or non-zero for failure cases4898 */4899static void pmcraid_set_supported_devs(struct pmcraid_cmd *cmd)4900{4901	struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb;4902	void (*cmd_done) (struct pmcraid_cmd *) = pmcraid_complete_ioa_reset;4903 4904	pmcraid_reinit_cmdblk(cmd);4905 4906	ioarcb->resource_handle = cpu_to_le32(PMCRAID_IOA_RES_HANDLE);4907	ioarcb->request_type = REQ_TYPE_IOACMD;4908	ioarcb->cdb[0] = PMCRAID_SET_SUPPORTED_DEVICES;4909	ioarcb->cdb[1] = ALL_DEVICES_SUPPORTED;4910 4911	/* If this was called as part of resource table reinitialization due to4912	 * lost CCN, it is enough to return the command block back to free pool4913	 * as part of set_supported_devs completion function.4914	 */4915	if (cmd->drv_inst->reinit_cfg_table) {4916		cmd->drv_inst->reinit_cfg_table = 0;4917		cmd->release = 1;4918		cmd_done = pmcraid_reinit_cfgtable_done;4919	}4920 4921	/* we will be done with the reset sequence after set supported devices,4922	 * setup the done function to return the command block back to free4923	 * pool4924	 */4925	pmcraid_send_cmd(cmd,4926			 cmd_done,4927			 PMCRAID_SET_SUP_DEV_TIMEOUT,4928			 pmcraid_timeout_handler);4929	return;4930}4931 4932/**4933 * pmcraid_set_timestamp - set the timestamp to IOAFP4934 *4935 * @cmd: pointer to pmcraid_cmd structure4936 *4937 * Return Value4938 *  0 for success or non-zero for failure cases4939 */4940static void pmcraid_set_timestamp(struct pmcraid_cmd *cmd)4941{4942	struct pmcraid_instance *pinstance = cmd->drv_inst;4943	struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb;4944	__be32 time_stamp_len = cpu_to_be32(PMCRAID_TIMESTAMP_LEN);4945	struct pmcraid_ioadl_desc *ioadl;4946	u64 timestamp;4947 4948	timestamp = ktime_get_real_seconds() * 1000;4949 4950	pinstance->timestamp_data->timestamp[0] = (__u8)(timestamp);4951	pinstance->timestamp_data->timestamp[1] = (__u8)((timestamp) >> 8);4952	pinstance->timestamp_data->timestamp[2] = (__u8)((timestamp) >> 16);4953	pinstance->timestamp_data->timestamp[3] = (__u8)((timestamp) >> 24);4954	pinstance->timestamp_data->timestamp[4] = (__u8)((timestamp) >> 32);4955	pinstance->timestamp_data->timestamp[5] = (__u8)((timestamp)  >> 40);4956 4957	pmcraid_reinit_cmdblk(cmd);4958	ioarcb->request_type = REQ_TYPE_SCSI;4959	ioarcb->resource_handle = cpu_to_le32(PMCRAID_IOA_RES_HANDLE);4960	ioarcb->cdb[0] = PMCRAID_SCSI_SET_TIMESTAMP;4961	ioarcb->cdb[1] = PMCRAID_SCSI_SERVICE_ACTION;4962	memcpy(&(ioarcb->cdb[6]), &time_stamp_len, sizeof(time_stamp_len));4963 4964	ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) +4965					offsetof(struct pmcraid_ioarcb,4966						add_data.u.ioadl[0]));4967	ioarcb->ioadl_length = cpu_to_le32(sizeof(struct pmcraid_ioadl_desc));4968	ioarcb->ioarcb_bus_addr &= cpu_to_le64(~(0x1FULL));4969 4970	ioarcb->request_flags0 |= NO_LINK_DESCS;4971	ioarcb->request_flags0 |= TRANSFER_DIR_WRITE;4972	ioarcb->data_transfer_length =4973		cpu_to_le32(sizeof(struct pmcraid_timestamp_data));4974	ioadl = &(ioarcb->add_data.u.ioadl[0]);4975	ioadl->flags = IOADL_FLAGS_LAST_DESC;4976	ioadl->address = cpu_to_le64(pinstance->timestamp_data_baddr);4977	ioadl->data_len = cpu_to_le32(sizeof(struct pmcraid_timestamp_data));4978 4979	if (!pinstance->timestamp_error) {4980		pinstance->timestamp_error = 0;4981		pmcraid_send_cmd(cmd, pmcraid_set_supported_devs,4982			 PMCRAID_INTERNAL_TIMEOUT, pmcraid_timeout_handler);4983	} else {4984		pmcraid_send_cmd(cmd, pmcraid_return_cmd,4985			 PMCRAID_INTERNAL_TIMEOUT, pmcraid_timeout_handler);4986		return;4987	}4988}4989 4990 4991/**4992 * pmcraid_init_res_table - Initialize the resource table4993 * @cmd:  pointer to pmcraid command struct4994 *4995 * This function looks through the existing resource table, comparing4996 * it with the config table. This function will take care of old/new4997 * devices and schedule adding/removing them from the mid-layer4998 * as appropriate.4999 *5000 * Return value5001 *	 None5002 */5003static void pmcraid_init_res_table(struct pmcraid_cmd *cmd)5004{5005	struct pmcraid_instance *pinstance = cmd->drv_inst;5006	struct pmcraid_resource_entry *res, *temp;5007	struct pmcraid_config_table_entry *cfgte;5008	unsigned long lock_flags;5009	int found, rc, i;5010	u16 fw_version;5011	LIST_HEAD(old_res);5012 5013	if (pinstance->cfg_table->flags & MICROCODE_UPDATE_REQUIRED)5014		pmcraid_err("IOA requires microcode download\n");5015 5016	fw_version = be16_to_cpu(pinstance->inq_data->fw_version);5017 5018	/* resource list is protected by pinstance->resource_lock.5019	 * init_res_table can be called from probe (user-thread) or runtime5020	 * reset (timer/tasklet)5021	 */5022	spin_lock_irqsave(&pinstance->resource_lock, lock_flags);5023 5024	list_for_each_entry_safe(res, temp, &pinstance->used_res_q, queue)5025		list_move_tail(&res->queue, &old_res);5026 5027	for (i = 0; i < le16_to_cpu(pinstance->cfg_table->num_entries); i++) {5028		if (be16_to_cpu(pinstance->inq_data->fw_version) <=5029						PMCRAID_FW_VERSION_1)5030			cfgte = &pinstance->cfg_table->entries[i];5031		else5032			cfgte = (struct pmcraid_config_table_entry *)5033					&pinstance->cfg_table->entries_ext[i];5034 5035		if (!pmcraid_expose_resource(fw_version, cfgte))5036			continue;5037 5038		found = 0;5039 5040		/* If this entry was already detected and initialized */5041		list_for_each_entry_safe(res, temp, &old_res, queue) {5042 5043			rc = memcmp(&res->cfg_entry.resource_address,5044				    &cfgte->resource_address,5045				    sizeof(cfgte->resource_address));5046			if (!rc) {5047				list_move_tail(&res->queue,5048						&pinstance->used_res_q);5049				found = 1;5050				break;5051			}5052		}5053 5054		/* If this is new entry, initialize it and add it the queue */5055		if (!found) {5056 5057			if (list_empty(&pinstance->free_res_q)) {5058				pmcraid_err("Too many devices attached\n");5059				break;5060			}5061 5062			found = 1;5063			res = list_entry(pinstance->free_res_q.next,5064					 struct pmcraid_resource_entry, queue);5065 5066			res->scsi_dev = NULL;5067			res->change_detected = RES_CHANGE_ADD;5068			res->reset_progress = 0;5069			list_move_tail(&res->queue, &pinstance->used_res_q);5070		}5071 5072		/* copy new configuration table entry details into driver5073		 * maintained resource entry5074		 */5075		if (found) {5076			memcpy(&res->cfg_entry, cfgte,5077					pinstance->config_table_entry_size);5078			pmcraid_info("New res type:%x, vset:%x, addr:%x:\n",5079				 res->cfg_entry.resource_type,5080				 (fw_version <= PMCRAID_FW_VERSION_1 ?5081					res->cfg_entry.unique_flags1 :5082					le16_to_cpu(res->cfg_entry.array_id) & 0xFF),5083				 le32_to_cpu(res->cfg_entry.resource_address));5084		}5085	}5086 5087	/* Detect any deleted entries, mark them for deletion from mid-layer */5088	list_for_each_entry_safe(res, temp, &old_res, queue) {5089 5090		if (res->scsi_dev) {5091			res->change_detected = RES_CHANGE_DEL;5092			res->cfg_entry.resource_handle =5093				PMCRAID_INVALID_RES_HANDLE;5094			list_move_tail(&res->queue, &pinstance->used_res_q);5095		} else {5096			list_move_tail(&res->queue, &pinstance->free_res_q);5097		}5098	}5099 5100	/* release the resource list lock */5101	spin_unlock_irqrestore(&pinstance->resource_lock, lock_flags);5102	pmcraid_set_timestamp(cmd);5103}5104 5105/**5106 * pmcraid_querycfg - Send a Query IOA Config to the adapter.5107 * @cmd: pointer pmcraid_cmd struct5108 *5109 * This function sends a Query IOA Configuration command to the adapter to5110 * retrieve the IOA configuration table.5111 *5112 * Return value:5113 *	none5114 */5115static void pmcraid_querycfg(struct pmcraid_cmd *cmd)5116{5117	struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb;5118	struct pmcraid_ioadl_desc *ioadl;5119	struct pmcraid_instance *pinstance = cmd->drv_inst;5120	__be32 cfg_table_size = cpu_to_be32(sizeof(struct pmcraid_config_table));5121 5122	if (be16_to_cpu(pinstance->inq_data->fw_version) <=5123					PMCRAID_FW_VERSION_1)5124		pinstance->config_table_entry_size =5125			sizeof(struct pmcraid_config_table_entry);5126	else5127		pinstance->config_table_entry_size =5128			sizeof(struct pmcraid_config_table_entry_ext);5129 5130	ioarcb->request_type = REQ_TYPE_IOACMD;5131	ioarcb->resource_handle = cpu_to_le32(PMCRAID_IOA_RES_HANDLE);5132 5133	ioarcb->cdb[0] = PMCRAID_QUERY_IOA_CONFIG;5134 5135	/* firmware requires 4-byte length field, specified in B.E format */5136	memcpy(&(ioarcb->cdb[10]), &cfg_table_size, sizeof(cfg_table_size));5137 5138	/* Since entire config table can be described by single IOADL, it can5139	 * be part of IOARCB itself5140	 */5141	ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) +5142					offsetof(struct pmcraid_ioarcb,5143						add_data.u.ioadl[0]));5144	ioarcb->ioadl_length = cpu_to_le32(sizeof(struct pmcraid_ioadl_desc));5145	ioarcb->ioarcb_bus_addr &= cpu_to_le64(~0x1FULL);5146 5147	ioarcb->request_flags0 |= NO_LINK_DESCS;5148	ioarcb->data_transfer_length =5149		cpu_to_le32(sizeof(struct pmcraid_config_table));5150 5151	ioadl = &(ioarcb->add_data.u.ioadl[0]);5152	ioadl->flags = IOADL_FLAGS_LAST_DESC;5153	ioadl->address = cpu_to_le64(pinstance->cfg_table_bus_addr);5154	ioadl->data_len = cpu_to_le32(sizeof(struct pmcraid_config_table));5155 5156	pmcraid_send_cmd(cmd, pmcraid_init_res_table,5157			 PMCRAID_INTERNAL_TIMEOUT, pmcraid_timeout_handler);5158}5159 5160 5161/**5162 * pmcraid_probe - PCI probe entry pointer for PMC MaxRAID controller driver5163 * @pdev: pointer to pci device structure5164 * @dev_id: pointer to device ids structure5165 *5166 * Return Value5167 *	returns 0 if the device is claimed and successfully configured.5168 *	returns non-zero error code in case of any failure5169 */5170static int pmcraid_probe(struct pci_dev *pdev,5171			 const struct pci_device_id *dev_id)5172{5173	struct pmcraid_instance *pinstance;5174	struct Scsi_Host *host;5175	void __iomem *mapped_pci_addr;5176	int rc = PCIBIOS_SUCCESSFUL;5177 5178	if (atomic_read(&pmcraid_adapter_count) >= PMCRAID_MAX_ADAPTERS) {5179		pmcraid_err5180			("maximum number(%d) of supported adapters reached\n",5181			 atomic_read(&pmcraid_adapter_count));5182		return -ENOMEM;5183	}5184 5185	atomic_inc(&pmcraid_adapter_count);5186	rc = pci_enable_device(pdev);5187 5188	if (rc) {5189		dev_err(&pdev->dev, "Cannot enable adapter\n");5190		atomic_dec(&pmcraid_adapter_count);5191		return rc;5192	}5193 5194	dev_info(&pdev->dev,5195		"Found new IOA(%x:%x), Total IOA count: %d\n",5196		 pdev->vendor, pdev->device,5197		 atomic_read(&pmcraid_adapter_count));5198 5199	rc = pci_request_regions(pdev, PMCRAID_DRIVER_NAME);5200 5201	if (rc < 0) {5202		dev_err(&pdev->dev,5203			"Couldn't register memory range of registers\n");5204		goto out_disable_device;5205	}5206 5207	mapped_pci_addr = pci_iomap(pdev, 0, 0);5208 5209	if (!mapped_pci_addr) {5210		dev_err(&pdev->dev, "Couldn't map PCI registers memory\n");5211		rc = -ENOMEM;5212		goto out_release_regions;5213	}5214 5215	pci_set_master(pdev);5216 5217	/* Firmware requires the system bus address of IOARCB to be within5218	 * 32-bit addressable range though it has 64-bit IOARRIN register.5219	 * However, firmware supports 64-bit streaming DMA buffers, whereas5220	 * coherent buffers are to be 32-bit. Since dma_alloc_coherent always5221	 * returns memory within 4GB (if not, change this logic), coherent5222	 * buffers are within firmware acceptable address ranges.5223	 */5224	if (sizeof(dma_addr_t) == 4 ||5225	    dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)))5226		rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));5227 5228	/* firmware expects 32-bit DMA addresses for IOARRIN register; set 325229	 * bit mask for dma_alloc_coherent to return addresses within 4GB5230	 */5231	if (rc == 0)5232		rc = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));5233 5234	if (rc != 0) {5235		dev_err(&pdev->dev, "Failed to set PCI DMA mask\n");5236		goto cleanup_nomem;5237	}5238 5239	host = scsi_host_alloc(&pmcraid_host_template,5240				sizeof(struct pmcraid_instance));5241 5242	if (!host) {5243		dev_err(&pdev->dev, "scsi_host_alloc failed!\n");5244		rc = -ENOMEM;5245		goto cleanup_nomem;5246	}5247 5248	host->max_id = PMCRAID_MAX_NUM_TARGETS_PER_BUS;5249	host->max_lun = PMCRAID_MAX_NUM_LUNS_PER_TARGET;5250	host->unique_id = host->host_no;5251	host->max_channel = PMCRAID_MAX_BUS_TO_SCAN;5252	host->max_cmd_len = PMCRAID_MAX_CDB_LEN;5253 5254	/* zero out entire instance structure */5255	pinstance = (struct pmcraid_instance *)host->hostdata;5256	memset(pinstance, 0, sizeof(*pinstance));5257 5258	pinstance->chip_cfg =5259		(struct pmcraid_chip_details *)(dev_id->driver_data);5260 5261	rc = pmcraid_init_instance(pdev, host, mapped_pci_addr);5262 5263	if (rc < 0) {5264		dev_err(&pdev->dev, "failed to initialize adapter instance\n");5265		goto out_scsi_host_put;5266	}5267 5268	pci_set_drvdata(pdev, pinstance);5269 5270	/* Save PCI config-space for use following the reset */5271	rc = pci_save_state(pinstance->pdev);5272 5273	if (rc != 0) {5274		dev_err(&pdev->dev, "Failed to save PCI config space\n");5275		goto out_scsi_host_put;5276	}5277 5278	pmcraid_disable_interrupts(pinstance, ~0);5279 5280	rc = pmcraid_register_interrupt_handler(pinstance);5281 5282	if (rc) {5283		dev_err(&pdev->dev, "couldn't register interrupt handler\n");5284		goto out_scsi_host_put;5285	}5286 5287	pmcraid_init_tasklets(pinstance);5288 5289	/* allocate verious buffers used by LLD.*/5290	rc = pmcraid_init_buffers(pinstance);5291 5292	if (rc) {5293		pmcraid_err("couldn't allocate memory blocks\n");5294		goto out_unregister_isr;5295	}5296 5297	/* check the reset type required */5298	pmcraid_reset_type(pinstance);5299 5300	pmcraid_enable_interrupts(pinstance, PMCRAID_PCI_INTERRUPTS);5301 5302	/* Start IOA firmware initialization and bring card to Operational5303	 * state.5304	 */5305	pmcraid_info("starting IOA initialization sequence\n");5306	if (pmcraid_reset_bringup(pinstance)) {5307		dev_err(&pdev->dev, "couldn't initialize IOA\n");5308		rc = 1;5309		goto out_release_bufs;5310	}5311 5312	/* Add adapter instance into mid-layer list */5313	rc = scsi_add_host(pinstance->host, &pdev->dev);5314	if (rc != 0) {5315		pmcraid_err("couldn't add host into mid-layer: %d\n", rc);5316		goto out_release_bufs;5317	}5318 5319	scsi_scan_host(pinstance->host);5320 5321	rc = pmcraid_setup_chrdev(pinstance);5322 5323	if (rc != 0) {5324		pmcraid_err("couldn't create mgmt interface, error: %x\n",5325			     rc);5326		goto out_remove_host;5327	}5328 5329	/* Schedule worker thread to handle CCN and take care of adding and5330	 * removing devices to OS5331	 */5332	atomic_set(&pinstance->expose_resources, 1);5333	schedule_work(&pinstance->worker_q);5334	return rc;5335 5336out_remove_host:5337	scsi_remove_host(host);5338 5339out_release_bufs:5340	pmcraid_release_buffers(pinstance);5341 5342out_unregister_isr:5343	pmcraid_kill_tasklets(pinstance);5344	pmcraid_unregister_interrupt_handler(pinstance);5345 5346out_scsi_host_put:5347	scsi_host_put(host);5348 5349cleanup_nomem:5350	iounmap(mapped_pci_addr);5351 5352out_release_regions:5353	pci_release_regions(pdev);5354 5355out_disable_device:5356	atomic_dec(&pmcraid_adapter_count);5357	pci_disable_device(pdev);5358	return -ENODEV;5359}5360 5361static SIMPLE_DEV_PM_OPS(pmcraid_pm_ops, pmcraid_suspend, pmcraid_resume);5362 5363/*5364 * PCI driver structure of pmcraid driver5365 */5366static struct pci_driver pmcraid_driver = {5367	.name = PMCRAID_DRIVER_NAME,5368	.id_table = pmcraid_pci_table,5369	.probe = pmcraid_probe,5370	.remove = pmcraid_remove,5371	.driver.pm = &pmcraid_pm_ops,5372	.shutdown = pmcraid_shutdown5373};5374 5375/**5376 * pmcraid_init - module load entry point5377 */5378static int __init pmcraid_init(void)5379{5380	dev_t dev;5381	int error;5382 5383	pmcraid_info("%s Device Driver version: %s\n",5384			 PMCRAID_DRIVER_NAME, PMCRAID_DRIVER_VERSION);5385 5386	error = alloc_chrdev_region(&dev, 0,5387				    PMCRAID_MAX_ADAPTERS,5388				    PMCRAID_DEVFILE);5389 5390	if (error) {5391		pmcraid_err("failed to get a major number for adapters\n");5392		goto out_init;5393	}5394 5395	pmcraid_major = MAJOR(dev);5396 5397	error = class_register(&pmcraid_class);5398 5399	if (error) {5400		pmcraid_err("failed to register with sysfs, error = %x\n",5401			    error);5402		goto out_unreg_chrdev;5403	}5404 5405	error = pmcraid_netlink_init();5406 5407	if (error) {5408		class_unregister(&pmcraid_class);5409		goto out_unreg_chrdev;5410	}5411 5412	error = pci_register_driver(&pmcraid_driver);5413 5414	if (error == 0)5415		goto out_init;5416 5417	pmcraid_err("failed to register pmcraid driver, error = %x\n",5418		     error);5419	class_unregister(&pmcraid_class);5420	pmcraid_netlink_release();5421 5422out_unreg_chrdev:5423	unregister_chrdev_region(MKDEV(pmcraid_major, 0), PMCRAID_MAX_ADAPTERS);5424 5425out_init:5426	return error;5427}5428 5429/**5430 * pmcraid_exit - module unload entry point5431 */5432static void __exit pmcraid_exit(void)5433{5434	pmcraid_netlink_release();5435	unregister_chrdev_region(MKDEV(pmcraid_major, 0),5436				 PMCRAID_MAX_ADAPTERS);5437	pci_unregister_driver(&pmcraid_driver);5438	class_unregister(&pmcraid_class);5439}5440 5441module_init(pmcraid_init);5442module_exit(pmcraid_exit);5443