Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) *******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3) **        O.S   : Linux
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4) **   FILE NAME  : arcmsr_hba.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5) **        BY    : Nick Cheng, C.L. Huang
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6) **   Description: SCSI RAID Device Driver for Areca RAID Controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7) *******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8) ** Copyright (C) 2002 - 2014, Areca Technology Corporation All rights reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10) **     Web site: www.areca.com.tw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11) **       E-mail: support@areca.com.tw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) ** This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) ** it under the terms of the GNU General Public License version 2 as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) ** published by the Free Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) ** This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) ** but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) ** GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) *******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) ** Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) ** modification, are permitted provided that the following conditions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) ** are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) ** 1. Redistributions of source code must retain the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) **    notice, this list of conditions and the following disclaimer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) ** 2. Redistributions in binary form must reproduce the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) **    notice, this list of conditions and the following disclaimer in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) **    documentation and/or other materials provided with the distribution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) ** 3. The name of the author may not be used to endorse or promote products
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) **    derived from this software without specific prior written permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING,BUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION)HOWEVER CAUSED AND ON ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) ** (INCLUDING NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) *******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) ** For history of changes, see Documentation/scsi/ChangeLog.arcmsr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) **     Firmware Specification, see Documentation/scsi/arcmsr_spec.rst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) *******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) #include <linux/reboot.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) #include <linux/pci_ids.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) #include <linux/moduleparam.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) #include <linux/dma-mapping.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) #include <linux/aer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) #include <linux/circ_buf.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) #include <asm/dma.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) #include <scsi/scsi_host.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) #include <scsi/scsi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) #include <scsi/scsi_cmnd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) #include <scsi/scsi_tcq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) #include <scsi/scsi_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) #include <scsi/scsi_transport.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) #include <scsi/scsicam.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) #include "arcmsr.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) MODULE_AUTHOR("Nick Cheng, C.L. Huang <support@areca.com.tw>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) MODULE_DESCRIPTION("Areca ARC11xx/12xx/16xx/188x SAS/SATA RAID Controller Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) MODULE_LICENSE("Dual BSD/GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) MODULE_VERSION(ARCMSR_DRIVER_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) static int msix_enable = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) module_param(msix_enable, int, S_IRUGO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) MODULE_PARM_DESC(msix_enable, "Enable MSI-X interrupt(0 ~ 1), msix_enable=1(enable), =0(disable)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) static int msi_enable = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) module_param(msi_enable, int, S_IRUGO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) MODULE_PARM_DESC(msi_enable, "Enable MSI interrupt(0 ~ 1), msi_enable=1(enable), =0(disable)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) static int host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) module_param(host_can_queue, int, S_IRUGO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) MODULE_PARM_DESC(host_can_queue, " adapter queue depth(32 ~ 1024), default is 128");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) static int cmd_per_lun = ARCMSR_DEFAULT_CMD_PERLUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) module_param(cmd_per_lun, int, S_IRUGO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) MODULE_PARM_DESC(cmd_per_lun, " device queue depth(1 ~ 128), default is 32");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) static int dma_mask_64 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) module_param(dma_mask_64, int, S_IRUGO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) MODULE_PARM_DESC(dma_mask_64, " set DMA mask to 64 bits(0 ~ 1), dma_mask_64=1(64 bits), =0(32 bits)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) static int set_date_time = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) module_param(set_date_time, int, S_IRUGO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) MODULE_PARM_DESC(set_date_time, " send date, time to iop(0 ~ 1), set_date_time=1(enable), default(=0) is disable");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) #define	ARCMSR_SLEEPTIME	10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) #define	ARCMSR_RETRYCOUNT	12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) static wait_queue_head_t wait_q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 					struct scsi_cmnd *cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) static int arcmsr_iop_confirm(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) static int arcmsr_abort(struct scsi_cmnd *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) static int arcmsr_bus_reset(struct scsi_cmnd *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) static int arcmsr_bios_param(struct scsi_device *sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 		struct block_device *bdev, sector_t capacity, int *info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) static int arcmsr_queue_command(struct Scsi_Host *h, struct scsi_cmnd *cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) static int arcmsr_probe(struct pci_dev *pdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 				const struct pci_device_id *id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) static int arcmsr_suspend(struct pci_dev *pdev, pm_message_t state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) static int arcmsr_resume(struct pci_dev *pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) static void arcmsr_remove(struct pci_dev *pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) static void arcmsr_shutdown(struct pci_dev *pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) static void arcmsr_iop_init(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) static void arcmsr_free_ccb_pool(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) static u32 arcmsr_disable_outbound_ints(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) static void arcmsr_enable_outbound_ints(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	u32 intmask_org);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) static void arcmsr_hbaA_flush_cache(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) static void arcmsr_hbaB_flush_cache(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) static void arcmsr_request_device_map(struct timer_list *t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) static void arcmsr_message_isr_bh_fn(struct work_struct *work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) static bool arcmsr_get_firmware_spec(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) static void arcmsr_hbaC_message_isr(struct AdapterControlBlock *pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) static void arcmsr_hbaD_message_isr(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) static void arcmsr_hbaE_message_isr(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) static void arcmsr_hbaE_postqueue_isr(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) static void arcmsr_hbaF_postqueue_isr(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) static void arcmsr_hardware_reset(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) static const char *arcmsr_info(struct Scsi_Host *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) static void arcmsr_free_irq(struct pci_dev *, struct AdapterControlBlock *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) static void arcmsr_set_iop_datetime(struct timer_list *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) static int arcmsr_adjust_disk_queue_depth(struct scsi_device *sdev, int queue_depth)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 	if (queue_depth > ARCMSR_MAX_CMD_PERLUN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 		queue_depth = ARCMSR_MAX_CMD_PERLUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 	return scsi_change_queue_depth(sdev, queue_depth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) static struct scsi_host_template arcmsr_scsi_host_template = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 	.module			= THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 	.name			= "Areca SAS/SATA RAID driver",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 	.info			= arcmsr_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	.queuecommand		= arcmsr_queue_command,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 	.eh_abort_handler	= arcmsr_abort,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 	.eh_bus_reset_handler	= arcmsr_bus_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	.bios_param		= arcmsr_bios_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 	.change_queue_depth	= arcmsr_adjust_disk_queue_depth,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 	.can_queue		= ARCMSR_DEFAULT_OUTSTANDING_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	.this_id		= ARCMSR_SCSI_INITIATOR_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 	.sg_tablesize	        = ARCMSR_DEFAULT_SG_ENTRIES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	.max_sectors		= ARCMSR_MAX_XFER_SECTORS_C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 	.cmd_per_lun		= ARCMSR_DEFAULT_CMD_PERLUN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 	.shost_attrs		= arcmsr_host_attrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 	.no_write_same		= 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) static struct pci_device_id arcmsr_device_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1110),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1120),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1130),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1160),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1170),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1200),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 		.driver_data = ACB_ADAPTER_TYPE_B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1201),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 		.driver_data = ACB_ADAPTER_TYPE_B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1202),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 		.driver_data = ACB_ADAPTER_TYPE_B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1203),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 		.driver_data = ACB_ADAPTER_TYPE_B},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1210),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1214),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 		.driver_data = ACB_ADAPTER_TYPE_D},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1220),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1230),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1260),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1270),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1280),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1380),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1381),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1680),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1681),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 		.driver_data = ACB_ADAPTER_TYPE_A},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1880),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 		.driver_data = ACB_ADAPTER_TYPE_C},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1884),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 		.driver_data = ACB_ADAPTER_TYPE_E},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 	{PCI_DEVICE(PCI_VENDOR_ID_ARECA, PCI_DEVICE_ID_ARECA_1886),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 		.driver_data = ACB_ADAPTER_TYPE_F},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 	{0, 0}, /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) MODULE_DEVICE_TABLE(pci, arcmsr_device_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) static struct pci_driver arcmsr_pci_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 	.name			= "arcmsr",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	.id_table		= arcmsr_device_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 	.probe			= arcmsr_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	.remove			= arcmsr_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 	.suspend		= arcmsr_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 	.resume			= arcmsr_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 	.shutdown		= arcmsr_shutdown,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) ****************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) ****************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) static void arcmsr_free_io_queue(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 		dma_free_coherent(&acb->pdev->dev, acb->ioqueue_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 			acb->dma_coherent2, acb->dma_coherent_handle2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) static bool arcmsr_remap_pciregion(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 	struct pci_dev *pdev = acb->pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 	switch (acb->adapter_type){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 	case ACB_ADAPTER_TYPE_A:{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 		acb->pmuA = ioremap(pci_resource_start(pdev,0), pci_resource_len(pdev,0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 		if (!acb->pmuA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 			printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 	case ACB_ADAPTER_TYPE_B:{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 		void __iomem *mem_base0, *mem_base1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 		mem_base0 = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 		if (!mem_base0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 			printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 		mem_base1 = ioremap(pci_resource_start(pdev, 2), pci_resource_len(pdev, 2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 		if (!mem_base1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 			iounmap(mem_base0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 			printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 		acb->mem_base0 = mem_base0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 		acb->mem_base1 = mem_base1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 	case ACB_ADAPTER_TYPE_C:{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 		acb->pmuC = ioremap(pci_resource_start(pdev, 1), pci_resource_len(pdev, 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 		if (!acb->pmuC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 			printk(KERN_NOTICE "arcmsr%d: memory mapping region fail \n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 		if (readl(&acb->pmuC->outbound_doorbell) & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 			writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR, &acb->pmuC->outbound_doorbell_clear);/*clear interrupt*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 		void __iomem *mem_base0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 		unsigned long addr, range;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 		addr = (unsigned long)pci_resource_start(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 		range = pci_resource_len(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 		mem_base0 = ioremap(addr, range);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 		if (!mem_base0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 			pr_notice("arcmsr%d: memory mapping region fail\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 				acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 		acb->mem_base0 = mem_base0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 	case ACB_ADAPTER_TYPE_E: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 		acb->pmuE = ioremap(pci_resource_start(pdev, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 			pci_resource_len(pdev, 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 		if (!acb->pmuE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 			pr_notice("arcmsr%d: memory mapping region fail \n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 				acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 		writel(0, &acb->pmuE->host_int_status); /*clear interrupt*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 		writel(ARCMSR_HBEMU_DOORBELL_SYNC, &acb->pmuE->iobound_doorbell);	/* synchronize doorbell to 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 		acb->in_doorbell = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 		acb->out_doorbell = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 		acb->pmuF = ioremap(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 		if (!acb->pmuF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 			pr_notice("arcmsr%d: memory mapping region fail\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 				acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 		writel(0, &acb->pmuF->host_int_status); /* clear interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 		writel(ARCMSR_HBFMU_DOORBELL_SYNC, &acb->pmuF->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 		acb->in_doorbell = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 		acb->out_doorbell = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) static void arcmsr_unmap_pciregion(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	case ACB_ADAPTER_TYPE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 		iounmap(acb->pmuA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 		iounmap(acb->mem_base0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 		iounmap(acb->mem_base1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 	case ACB_ADAPTER_TYPE_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 		iounmap(acb->pmuC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 		iounmap(acb->mem_base0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 		iounmap(acb->pmuE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 		iounmap(acb->pmuF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) static irqreturn_t arcmsr_do_interrupt(int irq, void *dev_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	irqreturn_t handle_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	struct AdapterControlBlock *acb = dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	handle_state = arcmsr_interrupt(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	return handle_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) static int arcmsr_bios_param(struct scsi_device *sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 		struct block_device *bdev, sector_t capacity, int *geom)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 	int heads, sectors, cylinders, total_capacity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	if (scsi_partsize(bdev, capacity, geom))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 	total_capacity = capacity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 	heads = 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 	sectors = 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 	cylinders = total_capacity / (heads * sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 	if (cylinders > 1024) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 		heads = 255;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 		sectors = 63;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 		cylinders = total_capacity / (heads * sectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 	geom[0] = heads;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 	geom[1] = sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 	geom[2] = cylinders;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) static uint8_t arcmsr_hbaA_wait_msgint_ready(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 	struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 	for (i = 0; i < 2000; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 		if (readl(&reg->outbound_intstatus) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 				ARCMSR_MU_OUTBOUND_MESSAGE0_INT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 			writel(ARCMSR_MU_OUTBOUND_MESSAGE0_INT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 				&reg->outbound_intstatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 		msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 	} /* max 20 seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) static uint8_t arcmsr_hbaB_wait_msgint_ready(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 	struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 	for (i = 0; i < 2000; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 		if (readl(reg->iop2drv_doorbell)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 			& ARCMSR_IOP2DRV_MESSAGE_CMD_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 			writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 					reg->iop2drv_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 			writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 					reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 		msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 	} /* max 20 seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) static uint8_t arcmsr_hbaC_wait_msgint_ready(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 	struct MessageUnit_C __iomem *phbcmu = pACB->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	for (i = 0; i < 2000; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 		if (readl(&phbcmu->outbound_doorbell)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 				& ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 			writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 				&phbcmu->outbound_doorbell_clear); /*clear interrupt*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 		msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 	} /* max 20 seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) static bool arcmsr_hbaD_wait_msgint_ready(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	struct MessageUnit_D *reg = pACB->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 	for (i = 0; i < 2000; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 		if (readl(reg->outbound_doorbell)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 			& ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 			writel(ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 				reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 		msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 	} /* max 20 seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) static bool arcmsr_hbaE_wait_msgint_ready(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 	uint32_t read_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	struct MessageUnit_E __iomem *phbcmu = pACB->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	for (i = 0; i < 2000; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 		read_doorbell = readl(&phbcmu->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 		if ((read_doorbell ^ pACB->in_doorbell) & ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 			writel(0, &phbcmu->host_int_status); /*clear interrupt*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 			pACB->in_doorbell = read_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 		msleep(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	} /* max 20 seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) static void arcmsr_hbaA_flush_cache(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	int retry_count = 30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	writel(ARCMSR_INBOUND_MESG0_FLUSH_CACHE, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 		if (arcmsr_hbaA_wait_msgint_ready(acb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 			retry_count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 			printk(KERN_NOTICE "arcmsr%d: wait 'flush adapter cache' \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 			timeout, retry count down = %d \n", acb->host->host_no, retry_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	} while (retry_count != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) static void arcmsr_hbaB_flush_cache(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 	int retry_count = 30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	writel(ARCMSR_MESSAGE_FLUSH_CACHE, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 		if (arcmsr_hbaB_wait_msgint_ready(acb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 			retry_count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 			printk(KERN_NOTICE "arcmsr%d: wait 'flush adapter cache' \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 			timeout,retry count down = %d \n", acb->host->host_no, retry_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	} while (retry_count != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) static void arcmsr_hbaC_flush_cache(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	struct MessageUnit_C __iomem *reg = pACB->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 	int retry_count = 30;/* enlarge wait flush adapter cache time: 10 minute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 	writel(ARCMSR_INBOUND_MESG0_FLUSH_CACHE, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 	writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 		if (arcmsr_hbaC_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 			retry_count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 			printk(KERN_NOTICE "arcmsr%d: wait 'flush adapter cache' \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 			timeout,retry count down = %d \n", pACB->host->host_no, retry_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	} while (retry_count != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) static void arcmsr_hbaD_flush_cache(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 	int retry_count = 15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 	struct MessageUnit_D *reg = pACB->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 	writel(ARCMSR_INBOUND_MESG0_FLUSH_CACHE, reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 		if (arcmsr_hbaD_wait_msgint_ready(pACB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 		retry_count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 		pr_notice("arcmsr%d: wait 'flush adapter "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 			"cache' timeout, retry count down = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 			pACB->host->host_no, retry_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 	} while (retry_count != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) static void arcmsr_hbaE_flush_cache(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 	int retry_count = 30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 	struct MessageUnit_E __iomem *reg = pACB->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 	writel(ARCMSR_INBOUND_MESG0_FLUSH_CACHE, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 	pACB->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	writel(pACB->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 		if (arcmsr_hbaE_wait_msgint_ready(pACB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 		retry_count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 		pr_notice("arcmsr%d: wait 'flush adapter "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 			"cache' timeout, retry count down = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 			pACB->host->host_no, retry_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	} while (retry_count != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) static void arcmsr_flush_adapter_cache(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 	case ACB_ADAPTER_TYPE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 		arcmsr_hbaA_flush_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 		arcmsr_hbaB_flush_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	case ACB_ADAPTER_TYPE_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 		arcmsr_hbaC_flush_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 		arcmsr_hbaD_flush_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 		arcmsr_hbaE_flush_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) static void arcmsr_hbaB_assign_regAddr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 	struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 	if (acb->pdev->device == PCI_DEVICE_ID_ARECA_1203) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 		reg->drv2iop_doorbell = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_1203);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 		reg->drv2iop_doorbell_mask = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK_1203);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 		reg->iop2drv_doorbell = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_1203);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 		reg->iop2drv_doorbell_mask = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK_1203);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 		reg->drv2iop_doorbell= MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 		reg->drv2iop_doorbell_mask = MEM_BASE0(ARCMSR_DRV2IOP_DOORBELL_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 		reg->iop2drv_doorbell = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 		reg->iop2drv_doorbell_mask = MEM_BASE0(ARCMSR_IOP2DRV_DOORBELL_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	reg->message_wbuffer = MEM_BASE1(ARCMSR_MESSAGE_WBUFFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 	reg->message_rbuffer =  MEM_BASE1(ARCMSR_MESSAGE_RBUFFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 	reg->message_rwbuffer = MEM_BASE1(ARCMSR_MESSAGE_RWBUFFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) static void arcmsr_hbaD_assign_regAddr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 	struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	reg->chip_id = MEM_BASE0(ARCMSR_ARC1214_CHIP_ID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 	reg->cpu_mem_config = MEM_BASE0(ARCMSR_ARC1214_CPU_MEMORY_CONFIGURATION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 	reg->i2o_host_interrupt_mask = MEM_BASE0(ARCMSR_ARC1214_I2_HOST_INTERRUPT_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 	reg->sample_at_reset = MEM_BASE0(ARCMSR_ARC1214_SAMPLE_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	reg->reset_request = MEM_BASE0(ARCMSR_ARC1214_RESET_REQUEST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 	reg->host_int_status = MEM_BASE0(ARCMSR_ARC1214_MAIN_INTERRUPT_STATUS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	reg->pcief0_int_enable = MEM_BASE0(ARCMSR_ARC1214_PCIE_F0_INTERRUPT_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 	reg->inbound_msgaddr0 = MEM_BASE0(ARCMSR_ARC1214_INBOUND_MESSAGE0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	reg->inbound_msgaddr1 = MEM_BASE0(ARCMSR_ARC1214_INBOUND_MESSAGE1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 	reg->outbound_msgaddr0 = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_MESSAGE0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 	reg->outbound_msgaddr1 = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_MESSAGE1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	reg->inbound_doorbell = MEM_BASE0(ARCMSR_ARC1214_INBOUND_DOORBELL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	reg->outbound_doorbell = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_DOORBELL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 	reg->outbound_doorbell_enable = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_DOORBELL_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	reg->inboundlist_base_low = MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_BASE_LOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 	reg->inboundlist_base_high = MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_BASE_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 	reg->inboundlist_write_pointer = MEM_BASE0(ARCMSR_ARC1214_INBOUND_LIST_WRITE_POINTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 	reg->outboundlist_base_low = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_BASE_LOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 	reg->outboundlist_base_high = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_BASE_HIGH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 	reg->outboundlist_copy_pointer = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_COPY_POINTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 	reg->outboundlist_read_pointer = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_LIST_READ_POINTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 	reg->outboundlist_interrupt_cause = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_INTERRUPT_CAUSE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	reg->outboundlist_interrupt_enable = MEM_BASE0(ARCMSR_ARC1214_OUTBOUND_INTERRUPT_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 	reg->message_wbuffer = MEM_BASE0(ARCMSR_ARC1214_MESSAGE_WBUFFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 	reg->message_rbuffer = MEM_BASE0(ARCMSR_ARC1214_MESSAGE_RBUFFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	reg->msgcode_rwbuffer = MEM_BASE0(ARCMSR_ARC1214_MESSAGE_RWBUFFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) static void arcmsr_hbaF_assign_regAddr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	dma_addr_t host_buffer_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	struct MessageUnit_F __iomem *pmuF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	memset(acb->dma_coherent2, 0xff, acb->completeQ_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 	acb->message_wbuffer = (uint32_t *)round_up((unsigned long)acb->dma_coherent2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 		acb->completeQ_size, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	acb->message_rbuffer = ((void *)acb->message_wbuffer) + 0x100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	acb->msgcode_rwbuffer = ((void *)acb->message_wbuffer) + 0x200;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	memset((void *)acb->message_wbuffer, 0, MESG_RW_BUFFER_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 	host_buffer_dma = round_up(acb->dma_coherent_handle2 + acb->completeQ_size, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	pmuF = acb->pmuF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	/* host buffer low address, bit0:1 all buffer active */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 	writel(lower_32_bits(host_buffer_dma | 1), &pmuF->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 	/* host buffer high address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 	writel(upper_32_bits(host_buffer_dma), &pmuF->inbound_msgaddr1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 	/* set host buffer physical address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 	writel(ARCMSR_HBFMU_DOORBELL_SYNC1, &pmuF->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) static bool arcmsr_alloc_io_queue(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 	bool rtn = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 	void *dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 	dma_addr_t dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 	struct pci_dev *pdev = acb->pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 		acb->ioqueue_size = roundup(sizeof(struct MessageUnit_B), 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 		dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 			&dma_coherent_handle, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 		if (!dma_coherent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 			pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 		acb->dma_coherent_handle2 = dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 		acb->dma_coherent2 = dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 		acb->pmuB = (struct MessageUnit_B *)dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 		arcmsr_hbaB_assign_regAddr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 		acb->ioqueue_size = roundup(sizeof(struct MessageUnit_D), 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 		dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 			&dma_coherent_handle, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 		if (!dma_coherent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 			pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 		acb->dma_coherent_handle2 = dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 		acb->dma_coherent2 = dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 		acb->pmuD = (struct MessageUnit_D *)dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 		arcmsr_hbaD_assign_regAddr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	case ACB_ADAPTER_TYPE_E: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 		uint32_t completeQ_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 		completeQ_size = sizeof(struct deliver_completeQ) * ARCMSR_MAX_HBE_DONEQUEUE + 128;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 		acb->ioqueue_size = roundup(completeQ_size, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 		dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 			&dma_coherent_handle, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 		if (!dma_coherent){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 			pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 		acb->dma_coherent_handle2 = dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 		acb->dma_coherent2 = dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 		acb->pCompletionQ = dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 		acb->completionQ_entry = acb->ioqueue_size / sizeof(struct deliver_completeQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 		acb->doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 		uint32_t QueueDepth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 		uint32_t depthTbl[] = {256, 512, 1024, 128, 64, 32};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 		arcmsr_wait_firmware_ready(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 		QueueDepth = depthTbl[readl(&acb->pmuF->outbound_msgaddr1) & 7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 		acb->completeQ_size = sizeof(struct deliver_completeQ) * QueueDepth + 128;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 		acb->ioqueue_size = roundup(acb->completeQ_size + MESG_RW_BUFFER_SIZE, 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 		dma_coherent = dma_alloc_coherent(&pdev->dev, acb->ioqueue_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 			&dma_coherent_handle, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 		if (!dma_coherent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 			pr_notice("arcmsr%d: DMA allocation failed\n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 			return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 		acb->dma_coherent_handle2 = dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 		acb->dma_coherent2 = dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 		acb->pCompletionQ = dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 		acb->completionQ_entry = acb->completeQ_size / sizeof(struct deliver_completeQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 		acb->doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 		arcmsr_hbaF_assign_regAddr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) static int arcmsr_alloc_ccb_pool(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 	struct pci_dev *pdev = acb->pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 	void *dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 	dma_addr_t dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	struct CommandControlBlock *ccb_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 	int i = 0, j = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 	unsigned long cdb_phyaddr, next_ccb_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 	unsigned long roundup_ccbsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 	unsigned long max_xfer_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 	unsigned long max_sg_entrys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 	uint32_t  firm_config_version, curr_phy_upper32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 	for (i = 0; i < ARCMSR_MAX_TARGETID; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 		for (j = 0; j < ARCMSR_MAX_TARGETLUN; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 			acb->devstate[i][j] = ARECA_RAID_GONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 	max_xfer_len = ARCMSR_MAX_XFER_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 	max_sg_entrys = ARCMSR_DEFAULT_SG_ENTRIES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	firm_config_version = acb->firm_cfg_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 	if((firm_config_version & 0xFF) >= 3){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 		max_xfer_len = (ARCMSR_CDB_SG_PAGE_LENGTH << ((firm_config_version >> 8) & 0xFF)) * 1024;/* max 4M byte */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 		max_sg_entrys = (max_xfer_len/4096);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 	acb->host->max_sectors = max_xfer_len/512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 	acb->host->sg_tablesize = max_sg_entrys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 	roundup_ccbsize = roundup(sizeof(struct CommandControlBlock) + (max_sg_entrys - 1) * sizeof(struct SG64ENTRY), 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 	acb->uncache_size = roundup_ccbsize * acb->maxFreeCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 	if (acb->adapter_type != ACB_ADAPTER_TYPE_F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 		acb->uncache_size += acb->ioqueue_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 	dma_coherent = dma_alloc_coherent(&pdev->dev, acb->uncache_size, &dma_coherent_handle, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 	if(!dma_coherent){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 		printk(KERN_NOTICE "arcmsr%d: dma_alloc_coherent got error\n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 	acb->dma_coherent = dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 	acb->dma_coherent_handle = dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 	memset(dma_coherent, 0, acb->uncache_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 	acb->ccbsize = roundup_ccbsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 	ccb_tmp = dma_coherent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 	curr_phy_upper32 = upper_32_bits(dma_coherent_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 	acb->vir2phy_offset = (unsigned long)dma_coherent - (unsigned long)dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 	for(i = 0; i < acb->maxFreeCCB; i++){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 		cdb_phyaddr = (unsigned long)dma_coherent_handle + offsetof(struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 		switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 		case ACB_ADAPTER_TYPE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 		case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 			ccb_tmp->cdb_phyaddr = cdb_phyaddr >> 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 		case ACB_ADAPTER_TYPE_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 		case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 		case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 		case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 			ccb_tmp->cdb_phyaddr = cdb_phyaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 		acb->pccb_pool[i] = ccb_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 		ccb_tmp->acb = acb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 		ccb_tmp->smid = (u32)i << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 		INIT_LIST_HEAD(&ccb_tmp->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 		next_ccb_phy = dma_coherent_handle + roundup_ccbsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 		if (upper_32_bits(next_ccb_phy) != curr_phy_upper32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 			acb->maxFreeCCB = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 			acb->host->can_queue = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 			list_add_tail(&ccb_tmp->list, &acb->ccb_free_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 		ccb_tmp = (struct CommandControlBlock *)((unsigned long)ccb_tmp + roundup_ccbsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 		dma_coherent_handle = next_ccb_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 	if (acb->adapter_type != ACB_ADAPTER_TYPE_F) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 		acb->dma_coherent_handle2 = dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 		acb->dma_coherent2 = ccb_tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 		acb->pmuB = (struct MessageUnit_B *)acb->dma_coherent2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 		arcmsr_hbaB_assign_regAddr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 		acb->pmuD = (struct MessageUnit_D *)acb->dma_coherent2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 		arcmsr_hbaD_assign_regAddr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 		acb->pCompletionQ = acb->dma_coherent2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 		acb->completionQ_entry = acb->ioqueue_size / sizeof(struct deliver_completeQ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 		acb->doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 	}	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) static void arcmsr_message_isr_bh_fn(struct work_struct *work) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 	struct AdapterControlBlock *acb = container_of(work,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 		struct AdapterControlBlock, arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 	char *acb_dev_map = (char *)acb->device_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 	uint32_t __iomem *signature = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 	char __iomem *devicemap = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 	int target, lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 	struct scsi_device *psdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 	char diff, temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 		struct MessageUnit_A __iomem *reg  = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 		signature = (uint32_t __iomem *)(&reg->message_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 		devicemap = (char __iomem *)(&reg->message_rwbuffer[21]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 		struct MessageUnit_B *reg  = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 		signature = (uint32_t __iomem *)(&reg->message_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 		devicemap = (char __iomem *)(&reg->message_rwbuffer[21]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 		struct MessageUnit_C __iomem *reg  = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 		signature = (uint32_t __iomem *)(&reg->msgcode_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 		devicemap = (char __iomem *)(&reg->msgcode_rwbuffer[21]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 		struct MessageUnit_D *reg  = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 		signature = (uint32_t __iomem *)(&reg->msgcode_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 		devicemap = (char __iomem *)(&reg->msgcode_rwbuffer[21]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 	case ACB_ADAPTER_TYPE_E: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 		struct MessageUnit_E __iomem *reg  = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 		signature = (uint32_t __iomem *)(&reg->msgcode_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 		devicemap = (char __iomem *)(&reg->msgcode_rwbuffer[21]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 		signature = (uint32_t __iomem *)(&acb->msgcode_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 		devicemap = (char __iomem *)(&acb->msgcode_rwbuffer[21]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 	if (readl(signature) != ARCMSR_SIGNATURE_GET_CONFIG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 	for (target = 0; target < ARCMSR_MAX_TARGETID - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 		target++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 		temp = readb(devicemap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 		diff = (*acb_dev_map) ^ temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 		if (diff != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 			*acb_dev_map = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 			for (lun = 0; lun < ARCMSR_MAX_TARGETLUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 				lun++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 				if ((diff & 0x01) == 1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 					(temp & 0x01) == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 					scsi_add_device(acb->host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 						0, target, lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 				} else if ((diff & 0x01) == 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 					&& (temp & 0x01) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 					psdev = scsi_device_lookup(acb->host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 						0, target, lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 					if (psdev != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 						scsi_remove_device(psdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 						scsi_device_put(psdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 				temp >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 				diff >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 		devicemap++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 		acb_dev_map++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 	acb->acb_flags &= ~ACB_F_MSG_GET_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) arcmsr_request_irq(struct pci_dev *pdev, struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 	int nvec, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 	if (msix_enable == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 		goto msi_int0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	nvec = pci_alloc_irq_vectors(pdev, 1, ARCMST_NUM_MSIX_VECTORS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 			PCI_IRQ_MSIX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	if (nvec > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 		pr_info("arcmsr%d: msi-x enabled\n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 		flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) msi_int0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 		if (msi_enable == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 			nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 			if (nvec == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 				dev_info(&pdev->dev, "msi enabled\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 				goto msi_int1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 		nvec = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_LEGACY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 		if (nvec < 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 			return FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) msi_int1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 		flags = IRQF_SHARED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	acb->vector_count = nvec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	for (i = 0; i < nvec; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 		if (request_irq(pci_irq_vector(pdev, i), arcmsr_do_interrupt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 				flags, "arcmsr", acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 			pr_warn("arcmsr%d: request_irq =%d failed!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 				acb->host->host_no, pci_irq_vector(pdev, i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 			goto out_free_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 	return SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) out_free_irq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	while (--i >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 		free_irq(pci_irq_vector(pdev, i), acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 	pci_free_irq_vectors(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 	return FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) static void arcmsr_init_get_devmap_timer(struct AdapterControlBlock *pacb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 	INIT_WORK(&pacb->arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	pacb->fw_flag = FW_NORMAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 	timer_setup(&pacb->eternal_timer, arcmsr_request_device_map, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 	pacb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 	add_timer(&pacb->eternal_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) static void arcmsr_init_set_datetime_timer(struct AdapterControlBlock *pacb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 	timer_setup(&pacb->refresh_timer, arcmsr_set_iop_datetime, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	pacb->refresh_timer.expires = jiffies + msecs_to_jiffies(60 * 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	add_timer(&pacb->refresh_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) static int arcmsr_set_dma_mask(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 	struct pci_dev *pcidev = acb->pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 	if (IS_DMA64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 		if (((acb->adapter_type == ACB_ADAPTER_TYPE_A) && !dma_mask_64) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 		    dma_set_mask(&pcidev->dev, DMA_BIT_MASK(64)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 			goto	dma32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 		if (dma_set_coherent_mask(&pcidev->dev, DMA_BIT_MASK(64)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 		    dma_set_mask_and_coherent(&pcidev->dev, DMA_BIT_MASK(64))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 			printk("arcmsr: set DMA 64 mask failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) dma32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 		if (dma_set_mask(&pcidev->dev, DMA_BIT_MASK(32)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 		    dma_set_coherent_mask(&pcidev->dev, DMA_BIT_MASK(32)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 		    dma_set_mask_and_coherent(&pcidev->dev, DMA_BIT_MASK(32))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 			printk("arcmsr: set DMA 32-bit mask failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 			return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) static int arcmsr_probe(struct pci_dev *pdev, const struct pci_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 	struct Scsi_Host *host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 	struct AdapterControlBlock *acb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 	uint8_t bus,dev_fun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 	error = pci_enable_device(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	if(error){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 	host = scsi_host_alloc(&arcmsr_scsi_host_template, sizeof(struct AdapterControlBlock));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 	if(!host){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)     		goto pci_disable_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 	init_waitqueue_head(&wait_q);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 	bus = pdev->bus->number;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 	dev_fun = pdev->devfn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 	acb = (struct AdapterControlBlock *) host->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 	memset(acb,0,sizeof(struct AdapterControlBlock));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 	acb->pdev = pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 	acb->adapter_type = id->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 	if (arcmsr_set_dma_mask(acb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 		goto scsi_host_release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 	acb->host = host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 	host->max_lun = ARCMSR_MAX_TARGETLUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	host->max_id = ARCMSR_MAX_TARGETID;		/*16:8*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	host->max_cmd_len = 16;	 			/*this is issue of 64bit LBA ,over 2T byte*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	if ((host_can_queue < ARCMSR_MIN_OUTSTANDING_CMD) || (host_can_queue > ARCMSR_MAX_OUTSTANDING_CMD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 		host_can_queue = ARCMSR_DEFAULT_OUTSTANDING_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	host->can_queue = host_can_queue;	/* max simultaneous cmds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	if ((cmd_per_lun < ARCMSR_MIN_CMD_PERLUN) || (cmd_per_lun > ARCMSR_MAX_CMD_PERLUN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 		cmd_per_lun = ARCMSR_DEFAULT_CMD_PERLUN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 	host->cmd_per_lun = cmd_per_lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	host->this_id = ARCMSR_SCSI_INITIATOR_ID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	host->unique_id = (bus << 8) | dev_fun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 	pci_set_drvdata(pdev, host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 	pci_set_master(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	error = pci_request_regions(pdev, "arcmsr");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	if(error){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 		goto scsi_host_release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 	spin_lock_init(&acb->eh_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 	spin_lock_init(&acb->ccblist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 	spin_lock_init(&acb->postq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 	spin_lock_init(&acb->doneq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	spin_lock_init(&acb->rqbuffer_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 	spin_lock_init(&acb->wqbuffer_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 			ACB_F_MESSAGE_RQBUFFER_CLEARED |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 			ACB_F_MESSAGE_WQBUFFER_READED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 	acb->acb_flags &= ~ACB_F_SCSISTOPADAPTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 	INIT_LIST_HEAD(&acb->ccb_free_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 	error = arcmsr_remap_pciregion(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 	if(!error){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 		goto pci_release_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 	error = arcmsr_alloc_io_queue(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 	if (!error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 		goto unmap_pci_region;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 	error = arcmsr_get_firmware_spec(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) 	if(!error){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 		goto free_hbb_mu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) 	if (acb->adapter_type != ACB_ADAPTER_TYPE_F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 		arcmsr_free_io_queue(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 	error = arcmsr_alloc_ccb_pool(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 	if(error){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 		goto unmap_pci_region;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	error = scsi_add_host(host, &pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 	if(error){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 		goto free_ccb_pool;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 	if (arcmsr_request_irq(pdev, acb) == FAILED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 		goto scsi_host_remove;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 	arcmsr_iop_init(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 	arcmsr_init_get_devmap_timer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 	if (set_date_time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 		arcmsr_init_set_datetime_timer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 	if(arcmsr_alloc_sysfs_attr(acb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 		goto out_free_sysfs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 	scsi_scan_host(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) out_free_sysfs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	if (set_date_time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 		del_timer_sync(&acb->refresh_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	del_timer_sync(&acb->eternal_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 	flush_work(&acb->arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 	arcmsr_stop_adapter_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 	arcmsr_flush_adapter_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 	arcmsr_free_irq(pdev, acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) scsi_host_remove:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 	scsi_remove_host(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) free_ccb_pool:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 	arcmsr_free_ccb_pool(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 	goto unmap_pci_region;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) free_hbb_mu:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 	arcmsr_free_io_queue(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) unmap_pci_region:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	arcmsr_unmap_pciregion(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) pci_release_regs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 	pci_release_regions(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) scsi_host_release:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 	scsi_host_put(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) pci_disable_dev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	pci_disable_device(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) static void arcmsr_free_irq(struct pci_dev *pdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 		struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 	for (i = 0; i < acb->vector_count; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 		free_irq(pci_irq_vector(pdev, i), acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 	pci_free_irq_vectors(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) static int arcmsr_suspend(struct pci_dev *pdev, pm_message_t state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 	struct Scsi_Host *host = pci_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	struct AdapterControlBlock *acb =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 		(struct AdapterControlBlock *)host->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	arcmsr_disable_outbound_ints(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 	arcmsr_free_irq(pdev, acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 	del_timer_sync(&acb->eternal_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 	if (set_date_time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 		del_timer_sync(&acb->refresh_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 	flush_work(&acb->arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 	arcmsr_stop_adapter_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 	arcmsr_flush_adapter_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 	pci_set_drvdata(pdev, host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 	pci_save_state(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 	pci_disable_device(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	pci_set_power_state(pdev, pci_choose_state(pdev, state));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) static int arcmsr_resume(struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 	struct Scsi_Host *host = pci_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 	struct AdapterControlBlock *acb =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 		(struct AdapterControlBlock *)host->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 	pci_set_power_state(pdev, PCI_D0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 	pci_enable_wake(pdev, PCI_D0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 	pci_restore_state(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	if (pci_enable_device(pdev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 		pr_warn("%s: pci_enable_device error\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 		return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 	if (arcmsr_set_dma_mask(acb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 		goto controller_unregister;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	pci_set_master(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	if (arcmsr_request_irq(pdev, acb) == FAILED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 		goto controller_stop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 		uint32_t i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 		for (i = 0; i < ARCMSR_MAX_HBB_POSTQUEUE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 			reg->post_qbuffer[i] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 			reg->done_qbuffer[i] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 		reg->postq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 		reg->doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 		writel(0, &acb->pmuE->host_int_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 		writel(ARCMSR_HBEMU_DOORBELL_SYNC, &acb->pmuE->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 		acb->in_doorbell = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 		acb->out_doorbell = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 		acb->doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 		writel(0, &acb->pmuF->host_int_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 		writel(ARCMSR_HBFMU_DOORBELL_SYNC, &acb->pmuF->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 		acb->in_doorbell = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 		acb->out_doorbell = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 		acb->doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 		arcmsr_hbaF_assign_regAddr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 	arcmsr_iop_init(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 	arcmsr_init_get_devmap_timer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 	if (set_date_time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 		arcmsr_init_set_datetime_timer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) controller_stop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 	arcmsr_stop_adapter_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 	arcmsr_flush_adapter_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) controller_unregister:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 	scsi_remove_host(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 	arcmsr_free_ccb_pool(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 	if (acb->adapter_type == ACB_ADAPTER_TYPE_F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 		arcmsr_free_io_queue(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 	arcmsr_unmap_pciregion(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 	pci_release_regions(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 	scsi_host_put(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 	pci_disable_device(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 	return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) static uint8_t arcmsr_hbaA_abort_allcmd(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 	struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 	writel(ARCMSR_INBOUND_MESG0_ABORT_CMD, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 	if (!arcmsr_hbaA_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 		printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 			"arcmsr%d: wait 'abort all outstanding command' timeout\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 			, acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) static uint8_t arcmsr_hbaB_abort_allcmd(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 	struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 	writel(ARCMSR_MESSAGE_ABORT_CMD, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 	if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 		printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 			"arcmsr%d: wait 'abort all outstanding command' timeout\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 			, acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) static uint8_t arcmsr_hbaC_abort_allcmd(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 	struct MessageUnit_C __iomem *reg = pACB->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 	writel(ARCMSR_INBOUND_MESG0_ABORT_CMD, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 	writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 	if (!arcmsr_hbaC_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 		printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 			"arcmsr%d: wait 'abort all outstanding command' timeout\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 			, pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) static uint8_t arcmsr_hbaD_abort_allcmd(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 	struct MessageUnit_D *reg = pACB->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 	writel(ARCMSR_INBOUND_MESG0_ABORT_CMD, reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 	if (!arcmsr_hbaD_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 		pr_notice("arcmsr%d: wait 'abort all outstanding "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 			"command' timeout\n", pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) static uint8_t arcmsr_hbaE_abort_allcmd(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 	struct MessageUnit_E __iomem *reg = pACB->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 	writel(ARCMSR_INBOUND_MESG0_ABORT_CMD, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 	pACB->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 	writel(pACB->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 	if (!arcmsr_hbaE_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 		pr_notice("arcmsr%d: wait 'abort all outstanding "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 			"command' timeout\n", pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) static uint8_t arcmsr_abort_allcmd(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 	uint8_t rtnval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 	case ACB_ADAPTER_TYPE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 		rtnval = arcmsr_hbaA_abort_allcmd(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 		rtnval = arcmsr_hbaB_abort_allcmd(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 	case ACB_ADAPTER_TYPE_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 		rtnval = arcmsr_hbaC_abort_allcmd(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 		rtnval = arcmsr_hbaD_abort_allcmd(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 		rtnval = arcmsr_hbaE_abort_allcmd(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 	return rtnval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) static void arcmsr_pci_unmap_dma(struct CommandControlBlock *ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 	struct scsi_cmnd *pcmd = ccb->pcmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 	scsi_dma_unmap(pcmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) static void arcmsr_ccb_complete(struct CommandControlBlock *ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 	struct AdapterControlBlock *acb = ccb->acb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 	struct scsi_cmnd *pcmd = ccb->pcmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 	atomic_dec(&acb->ccboutstandingcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 	arcmsr_pci_unmap_dma(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 	ccb->startdone = ARCMSR_CCB_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 	spin_lock_irqsave(&acb->ccblist_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 	list_add_tail(&ccb->list, &acb->ccb_free_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 	spin_unlock_irqrestore(&acb->ccblist_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 	pcmd->scsi_done(pcmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) static void arcmsr_report_sense_info(struct CommandControlBlock *ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 	struct scsi_cmnd *pcmd = ccb->pcmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 	struct SENSE_DATA *sensebuffer = (struct SENSE_DATA *)pcmd->sense_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 	pcmd->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 	if (sensebuffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 		int sense_data_length =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 			sizeof(struct SENSE_DATA) < SCSI_SENSE_BUFFERSIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 			? sizeof(struct SENSE_DATA) : SCSI_SENSE_BUFFERSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 		memset(sensebuffer, 0, SCSI_SENSE_BUFFERSIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 		memcpy(sensebuffer, ccb->arcmsr_cdb.SenseData, sense_data_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 		sensebuffer->ErrorCode = SCSI_SENSE_CURRENT_ERRORS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 		sensebuffer->Valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 		pcmd->result |= (DRIVER_SENSE << 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) static u32 arcmsr_disable_outbound_ints(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 	u32 orig_mask = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 	switch (acb->adapter_type) {	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 	case ACB_ADAPTER_TYPE_A : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 		orig_mask = readl(&reg->outbound_intmask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 		writel(orig_mask|ARCMSR_MU_OUTBOUND_ALL_INTMASKENABLE, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 						&reg->outbound_intmask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 	case ACB_ADAPTER_TYPE_B : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 		orig_mask = readl(reg->iop2drv_doorbell_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 		writel(0, reg->iop2drv_doorbell_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 	case ACB_ADAPTER_TYPE_C:{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 		struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 		/* disable all outbound interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 		orig_mask = readl(&reg->host_int_mask); /* disable outbound message0 int */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 		writel(orig_mask|ARCMSR_HBCMU_ALL_INTMASKENABLE, &reg->host_int_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 		struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 		/* disable all outbound interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 		writel(ARCMSR_ARC1214_ALL_INT_DISABLE, reg->pcief0_int_enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 		struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 		orig_mask = readl(&reg->host_int_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 		writel(orig_mask | ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR | ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR, &reg->host_int_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 		readl(&reg->host_int_mask); /* Dummy readl to force pci flush */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 	return orig_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) static void arcmsr_report_ccb_state(struct AdapterControlBlock *acb, 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 			struct CommandControlBlock *ccb, bool error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 	uint8_t id, lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 	id = ccb->pcmd->device->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 	lun = ccb->pcmd->device->lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 	if (!error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 		if (acb->devstate[id][lun] == ARECA_RAID_GONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 			acb->devstate[id][lun] = ARECA_RAID_GOOD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 		ccb->pcmd->result = DID_OK << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 		arcmsr_ccb_complete(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 	}else{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 		switch (ccb->arcmsr_cdb.DeviceStatus) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 		case ARCMSR_DEV_SELECT_TIMEOUT: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 			acb->devstate[id][lun] = ARECA_RAID_GONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 			ccb->pcmd->result = DID_NO_CONNECT << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 			arcmsr_ccb_complete(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 		case ARCMSR_DEV_ABORTED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 		case ARCMSR_DEV_INIT_FAIL: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 			acb->devstate[id][lun] = ARECA_RAID_GONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 			ccb->pcmd->result = DID_BAD_TARGET << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 			arcmsr_ccb_complete(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 		case ARCMSR_DEV_CHECK_CONDITION: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 			acb->devstate[id][lun] = ARECA_RAID_GOOD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 			arcmsr_report_sense_info(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 			arcmsr_ccb_complete(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 			printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 				"arcmsr%d: scsi id = %d lun = %d isr get command error done, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 				but got unknown DeviceStatus = 0x%x \n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 				, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 				, id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 				, lun
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 				, ccb->arcmsr_cdb.DeviceStatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 				acb->devstate[id][lun] = ARECA_RAID_GONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 				ccb->pcmd->result = DID_NO_CONNECT << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 				arcmsr_ccb_complete(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, struct CommandControlBlock *pCCB, bool error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 	if ((pCCB->acb != acb) || (pCCB->startdone != ARCMSR_CCB_START)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 		if (pCCB->startdone == ARCMSR_CCB_ABORTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 			struct scsi_cmnd *abortcmd = pCCB->pcmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 			if (abortcmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 				abortcmd->result |= DID_ABORT << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 				arcmsr_ccb_complete(pCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 				printk(KERN_NOTICE "arcmsr%d: pCCB ='0x%p' isr got aborted command \n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 				acb->host->host_no, pCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 		printk(KERN_NOTICE "arcmsr%d: isr get an illegal ccb command \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 				done acb = '0x%p'"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 				"ccb = '0x%p' ccbacb = '0x%p' startdone = 0x%x"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) 				" ccboutstandingcount = %d \n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 				, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 				, acb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 				, pCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 				, pCCB->acb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 				, pCCB->startdone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 				, atomic_read(&acb->ccboutstandingcount));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 	arcmsr_report_ccb_state(acb, pCCB, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) static void arcmsr_done4abort_postqueue(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 	int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 	uint32_t flag_ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 	struct ARCMSR_CDB *pARCMSR_CDB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 	bool error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 	struct CommandControlBlock *pCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 	unsigned long ccb_cdb_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 		uint32_t outbound_intstatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 		outbound_intstatus = readl(&reg->outbound_intstatus) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 					acb->outbound_int_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 		/*clear and abort all outbound posted Q*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 		writel(outbound_intstatus, &reg->outbound_intstatus);/*clear interrupt*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 		while(((flag_ccb = readl(&reg->outbound_queueport)) != 0xFFFFFFFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 				&& (i++ < acb->maxOutstanding)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 			ccb_cdb_phy = (flag_ccb << 5) & 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 			if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 				ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 			pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 			pCCB = container_of(pARCMSR_CDB, struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 			error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 			arcmsr_drain_donequeue(acb, pCCB, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 		/*clear all outbound posted Q*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 		writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, reg->iop2drv_doorbell); /* clear doorbell interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 		for (i = 0; i < ARCMSR_MAX_HBB_POSTQUEUE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 			flag_ccb = reg->done_qbuffer[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 			if (flag_ccb != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 				reg->done_qbuffer[i] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 				ccb_cdb_phy = (flag_ccb << 5) & 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 				if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 					ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 				pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 				pCCB = container_of(pARCMSR_CDB, struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 				error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 				arcmsr_drain_donequeue(acb, pCCB, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 			reg->post_qbuffer[i] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) 		reg->doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 		reg->postq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 		struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 		while ((readl(&reg->host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) && (i++ < acb->maxOutstanding)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 			/*need to do*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 			flag_ccb = readl(&reg->outbound_queueport_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 			ccb_cdb_phy = (flag_ccb & 0xFFFFFFF0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 			if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 				ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 			pARCMSR_CDB = (struct  ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 			pCCB = container_of(pARCMSR_CDB, struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 			error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE1) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 			arcmsr_drain_donequeue(acb, pCCB, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 		struct MessageUnit_D  *pmu = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 		uint32_t outbound_write_pointer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 		uint32_t doneq_index, index_stripped, addressLow, residual, toggle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 		unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 		residual = atomic_read(&acb->ccboutstandingcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 		for (i = 0; i < residual; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 			spin_lock_irqsave(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 			outbound_write_pointer =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 				pmu->done_qbuffer[0].addressLow + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 			doneq_index = pmu->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 			if ((doneq_index & 0xFFF) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) 				(outbound_write_pointer & 0xFFF)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 				toggle = doneq_index & 0x4000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 				index_stripped = (doneq_index & 0xFFF) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 				index_stripped %= ARCMSR_MAX_ARC1214_DONEQUEUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) 				pmu->doneq_index = index_stripped ? (index_stripped | toggle) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 					((toggle ^ 0x4000) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) 				doneq_index = pmu->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) 				spin_unlock_irqrestore(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 				addressLow = pmu->done_qbuffer[doneq_index &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 					0xFFF].addressLow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 				ccb_cdb_phy = (addressLow & 0xFFFFFFF0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 				if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 					ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) 				pARCMSR_CDB = (struct  ARCMSR_CDB *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 					(acb->vir2phy_offset + ccb_cdb_phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 				pCCB = container_of(pARCMSR_CDB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 					struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) 				error = (addressLow &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 					ARCMSR_CCBREPLY_FLAG_ERROR_MODE1) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) 					true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 				arcmsr_drain_donequeue(acb, pCCB, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) 				writel(doneq_index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 					pmu->outboundlist_read_pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 				spin_unlock_irqrestore(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 				mdelay(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 		pmu->postq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 		pmu->doneq_index = 0x40FF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 		arcmsr_hbaE_postqueue_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) 		arcmsr_hbaF_postqueue_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) static void arcmsr_remove_scsi_devices(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 	char *acb_dev_map = (char *)acb->device_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 	int target, lun, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 	struct scsi_device *psdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 	struct CommandControlBlock *ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 	char temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 	for (i = 0; i < acb->maxFreeCCB; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 		ccb = acb->pccb_pool[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 		if (ccb->startdone == ARCMSR_CCB_START) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 			ccb->pcmd->result = DID_NO_CONNECT << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 			arcmsr_pci_unmap_dma(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 			ccb->pcmd->scsi_done(ccb->pcmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 	for (target = 0; target < ARCMSR_MAX_TARGETID; target++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 		temp = *acb_dev_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 		if (temp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 			for (lun = 0; lun < ARCMSR_MAX_TARGETLUN; lun++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 				if (temp & 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 					psdev = scsi_device_lookup(acb->host,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 						0, target, lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) 					if (psdev != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) 						scsi_remove_device(psdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 						scsi_device_put(psdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 				temp >>= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) 			*acb_dev_map = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) 		acb_dev_map++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) static void arcmsr_free_pcidev(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 	struct pci_dev *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 	struct Scsi_Host *host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 	host = acb->host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) 	arcmsr_free_sysfs_attr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 	scsi_remove_host(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) 	flush_work(&acb->arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 	del_timer_sync(&acb->eternal_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 	if (set_date_time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 		del_timer_sync(&acb->refresh_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) 	pdev = acb->pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) 	arcmsr_free_irq(pdev, acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 	arcmsr_free_ccb_pool(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) 	if (acb->adapter_type == ACB_ADAPTER_TYPE_F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) 		arcmsr_free_io_queue(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) 	arcmsr_unmap_pciregion(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 	pci_release_regions(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) 	scsi_host_put(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 	pci_disable_device(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) static void arcmsr_remove(struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) 	struct Scsi_Host *host = pci_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) 	struct AdapterControlBlock *acb =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) 		(struct AdapterControlBlock *) host->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) 	int poll_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) 	uint16_t dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) 	pci_read_config_word(pdev, PCI_DEVICE_ID, &dev_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) 	if (dev_id == 0xffff) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) 		acb->acb_flags &= ~ACB_F_IOP_INITED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) 		acb->acb_flags |= ACB_F_ADAPTER_REMOVED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) 		arcmsr_remove_scsi_devices(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) 		arcmsr_free_pcidev(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) 	arcmsr_free_sysfs_attr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) 	scsi_remove_host(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) 	flush_work(&acb->arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) 	del_timer_sync(&acb->eternal_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) 	if (set_date_time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) 		del_timer_sync(&acb->refresh_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) 	arcmsr_disable_outbound_ints(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) 	arcmsr_stop_adapter_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 	arcmsr_flush_adapter_cache(acb);	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) 	acb->acb_flags |= ACB_F_SCSISTOPADAPTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) 	acb->acb_flags &= ~ACB_F_IOP_INITED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 	for (poll_count = 0; poll_count < acb->maxOutstanding; poll_count++){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) 		if (!atomic_read(&acb->ccboutstandingcount))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) 		arcmsr_interrupt(acb);/* FIXME: need spinlock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) 		msleep(25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) 	if (atomic_read(&acb->ccboutstandingcount)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) 		int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) 		arcmsr_abort_allcmd(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) 		arcmsr_done4abort_postqueue(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) 		for (i = 0; i < acb->maxFreeCCB; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) 			struct CommandControlBlock *ccb = acb->pccb_pool[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) 			if (ccb->startdone == ARCMSR_CCB_START) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) 				ccb->startdone = ARCMSR_CCB_ABORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) 				ccb->pcmd->result = DID_ABORT << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) 				arcmsr_ccb_complete(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) 	arcmsr_free_irq(pdev, acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) 	arcmsr_free_ccb_pool(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) 	if (acb->adapter_type == ACB_ADAPTER_TYPE_F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) 		arcmsr_free_io_queue(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) 	arcmsr_unmap_pciregion(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) 	pci_release_regions(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) 	scsi_host_put(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) 	pci_disable_device(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) static void arcmsr_shutdown(struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) 	struct Scsi_Host *host = pci_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) 	struct AdapterControlBlock *acb =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) 		(struct AdapterControlBlock *)host->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) 	if (acb->acb_flags & ACB_F_ADAPTER_REMOVED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) 	del_timer_sync(&acb->eternal_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) 	if (set_date_time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) 		del_timer_sync(&acb->refresh_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) 	arcmsr_disable_outbound_ints(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) 	arcmsr_free_irq(pdev, acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) 	flush_work(&acb->arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) 	arcmsr_stop_adapter_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) 	arcmsr_flush_adapter_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) static int arcmsr_module_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) 	int error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) 	error = pci_register_driver(&arcmsr_pci_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) 	return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) static void arcmsr_module_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) 	pci_unregister_driver(&arcmsr_pci_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) module_init(arcmsr_module_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) module_exit(arcmsr_module_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) static void arcmsr_enable_outbound_ints(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) 						u32 intmask_org)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) 	u32 mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) 		mask = intmask_org & ~(ARCMSR_MU_OUTBOUND_POSTQUEUE_INTMASKENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) 			     ARCMSR_MU_OUTBOUND_DOORBELL_INTMASKENABLE|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) 			     ARCMSR_MU_OUTBOUND_MESSAGE0_INTMASKENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) 		writel(mask, &reg->outbound_intmask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) 		acb->outbound_int_enable = ~(intmask_org & mask) & 0x000000ff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) 		mask = intmask_org | (ARCMSR_IOP2DRV_DATA_WRITE_OK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) 			ARCMSR_IOP2DRV_DATA_READ_OK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) 			ARCMSR_IOP2DRV_CDB_DONE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) 			ARCMSR_IOP2DRV_MESSAGE_CMD_DONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) 		writel(mask, reg->iop2drv_doorbell_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) 		acb->outbound_int_enable = (intmask_org | mask) & 0x0000000f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) 		struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) 		mask = ~(ARCMSR_HBCMU_UTILITY_A_ISR_MASK | ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR_MASK|ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) 		writel(intmask_org & mask, &reg->host_int_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) 		acb->outbound_int_enable = ~(intmask_org & mask) & 0x0000000f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) 		struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) 		mask = ARCMSR_ARC1214_ALL_INT_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) 		writel(intmask_org | mask, reg->pcief0_int_enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) 		struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) 		mask = ~(ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR | ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) 		writel(intmask_org & mask, &reg->host_int_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) static int arcmsr_build_ccb(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) 	struct CommandControlBlock *ccb, struct scsi_cmnd *pcmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) 	struct ARCMSR_CDB *arcmsr_cdb = (struct ARCMSR_CDB *)&ccb->arcmsr_cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) 	int8_t *psge = (int8_t *)&arcmsr_cdb->u;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) 	__le32 address_lo, address_hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) 	int arccdbsize = 0x30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) 	__le32 length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) 	struct scatterlist *sg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) 	int nseg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) 	ccb->pcmd = pcmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) 	memset(arcmsr_cdb, 0, sizeof(struct ARCMSR_CDB));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) 	arcmsr_cdb->TargetID = pcmd->device->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) 	arcmsr_cdb->LUN = pcmd->device->lun;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) 	arcmsr_cdb->Function = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) 	arcmsr_cdb->msgContext = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) 	memcpy(arcmsr_cdb->Cdb, pcmd->cmnd, pcmd->cmd_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) 	nseg = scsi_dma_map(pcmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) 	if (unlikely(nseg > acb->host->sg_tablesize || nseg < 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) 		return FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) 	scsi_for_each_sg(pcmd, sg, nseg, i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) 		/* Get the physical address of the current data pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) 		length = cpu_to_le32(sg_dma_len(sg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) 		address_lo = cpu_to_le32(dma_addr_lo32(sg_dma_address(sg)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) 		address_hi = cpu_to_le32(dma_addr_hi32(sg_dma_address(sg)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) 		if (address_hi == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) 			struct SG32ENTRY *pdma_sg = (struct SG32ENTRY *)psge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) 			pdma_sg->address = address_lo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) 			pdma_sg->length = length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) 			psge += sizeof (struct SG32ENTRY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) 			arccdbsize += sizeof (struct SG32ENTRY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) 			struct SG64ENTRY *pdma_sg = (struct SG64ENTRY *)psge;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) 			pdma_sg->addresshigh = address_hi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) 			pdma_sg->address = address_lo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) 			pdma_sg->length = length|cpu_to_le32(IS_SG64_ADDR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) 			psge += sizeof (struct SG64ENTRY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) 			arccdbsize += sizeof (struct SG64ENTRY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) 	arcmsr_cdb->sgcount = (uint8_t)nseg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) 	arcmsr_cdb->DataLength = scsi_bufflen(pcmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) 	arcmsr_cdb->msgPages = arccdbsize/0x100 + (arccdbsize % 0x100 ? 1 : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) 	if ( arccdbsize > 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) 		arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_SGL_BSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) 	if (pcmd->sc_data_direction == DMA_TO_DEVICE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) 		arcmsr_cdb->Flags |= ARCMSR_CDB_FLAG_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) 	ccb->arc_cdb_size = arccdbsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) 	return SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) static void arcmsr_post_ccb(struct AdapterControlBlock *acb, struct CommandControlBlock *ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) 	uint32_t cdb_phyaddr = ccb->cdb_phyaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) 	struct ARCMSR_CDB *arcmsr_cdb = (struct ARCMSR_CDB *)&ccb->arcmsr_cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) 	atomic_inc(&acb->ccboutstandingcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) 	ccb->startdone = ARCMSR_CCB_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) 		if (arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) 			writel(cdb_phyaddr | ARCMSR_CCBPOST_FLAG_SGL_BSIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) 			&reg->inbound_queueport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) 			writel(cdb_phyaddr, &reg->inbound_queueport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) 		uint32_t ending_index, index = reg->postq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) 		ending_index = ((index + 1) % ARCMSR_MAX_HBB_POSTQUEUE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) 		reg->post_qbuffer[ending_index] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) 		if (arcmsr_cdb->Flags & ARCMSR_CDB_FLAG_SGL_BSIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) 			reg->post_qbuffer[index] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) 				cdb_phyaddr | ARCMSR_CCBPOST_FLAG_SGL_BSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) 			reg->post_qbuffer[index] = cdb_phyaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) 		index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) 		index %= ARCMSR_MAX_HBB_POSTQUEUE;/*if last index number set it to 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) 		reg->postq_index = index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) 		writel(ARCMSR_DRV2IOP_CDB_POSTED, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) 		struct MessageUnit_C __iomem *phbcmu = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) 		uint32_t ccb_post_stamp, arc_cdb_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) 		arc_cdb_size = (ccb->arc_cdb_size > 0x300) ? 0x300 : ccb->arc_cdb_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) 		ccb_post_stamp = (cdb_phyaddr | ((arc_cdb_size - 1) >> 6) | 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) 		writel(upper_32_bits(ccb->cdb_phyaddr), &phbcmu->inbound_queueport_high);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) 		writel(ccb_post_stamp, &phbcmu->inbound_queueport_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) 		struct MessageUnit_D  *pmu = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) 		u16 index_stripped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) 		u16 postq_index, toggle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) 		unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) 		struct InBound_SRB *pinbound_srb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) 		spin_lock_irqsave(&acb->postq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) 		postq_index = pmu->postq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) 		pinbound_srb = (struct InBound_SRB *)&(pmu->post_qbuffer[postq_index & 0xFF]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) 		pinbound_srb->addressHigh = upper_32_bits(ccb->cdb_phyaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) 		pinbound_srb->addressLow = cdb_phyaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) 		pinbound_srb->length = ccb->arc_cdb_size >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) 		arcmsr_cdb->msgContext = dma_addr_lo32(cdb_phyaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) 		toggle = postq_index & 0x4000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) 		index_stripped = postq_index + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) 		index_stripped &= (ARCMSR_MAX_ARC1214_POSTQUEUE - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) 		pmu->postq_index = index_stripped ? (index_stripped | toggle) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) 			(toggle ^ 0x4000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) 		writel(postq_index, pmu->inboundlist_write_pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) 		spin_unlock_irqrestore(&acb->postq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) 	case ACB_ADAPTER_TYPE_E: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) 		struct MessageUnit_E __iomem *pmu = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) 		u32 ccb_post_stamp, arc_cdb_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) 		arc_cdb_size = (ccb->arc_cdb_size > 0x300) ? 0x300 : ccb->arc_cdb_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) 		ccb_post_stamp = (ccb->smid | ((arc_cdb_size - 1) >> 6));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) 		writel(0, &pmu->inbound_queueport_high);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) 		writel(ccb_post_stamp, &pmu->inbound_queueport_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) 		struct MessageUnit_F __iomem *pmu = acb->pmuF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) 		u32 ccb_post_stamp, arc_cdb_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) 		if (ccb->arc_cdb_size <= 0x300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) 			arc_cdb_size = (ccb->arc_cdb_size - 1) >> 6 | 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) 			arc_cdb_size = ((ccb->arc_cdb_size + 0xff) >> 8) + 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) 			if (arc_cdb_size > 0xF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) 				arc_cdb_size = 0xF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) 			arc_cdb_size = (arc_cdb_size << 1) | 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) 		ccb_post_stamp = (ccb->smid | arc_cdb_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) 		writel(0, &pmu->inbound_queueport_high);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) 		writel(ccb_post_stamp, &pmu->inbound_queueport_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) static void arcmsr_hbaA_stop_bgrb(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) 	struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) 	acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) 	writel(ARCMSR_INBOUND_MESG0_STOP_BGRB, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) 	if (!arcmsr_hbaA_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) 		printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) 			"arcmsr%d: wait 'stop adapter background rebuild' timeout\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) 			, acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) static void arcmsr_hbaB_stop_bgrb(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) 	struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) 	acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) 	writel(ARCMSR_MESSAGE_STOP_BGRB, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) 	if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) 		printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) 			"arcmsr%d: wait 'stop adapter background rebuild' timeout\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) 			, acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) static void arcmsr_hbaC_stop_bgrb(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) 	struct MessageUnit_C __iomem *reg = pACB->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) 	pACB->acb_flags &= ~ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) 	writel(ARCMSR_INBOUND_MESG0_STOP_BGRB, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) 	writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) 	if (!arcmsr_hbaC_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) 		printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) 			"arcmsr%d: wait 'stop adapter background rebuild' timeout\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) 			, pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) static void arcmsr_hbaD_stop_bgrb(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) 	struct MessageUnit_D *reg = pACB->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) 	pACB->acb_flags &= ~ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) 	writel(ARCMSR_INBOUND_MESG0_STOP_BGRB, reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) 	if (!arcmsr_hbaD_wait_msgint_ready(pACB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) 		pr_notice("arcmsr%d: wait 'stop adapter background rebuild' "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) 			"timeout\n", pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) static void arcmsr_hbaE_stop_bgrb(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) 	struct MessageUnit_E __iomem *reg = pACB->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) 	pACB->acb_flags &= ~ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) 	writel(ARCMSR_INBOUND_MESG0_STOP_BGRB, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) 	pACB->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) 	writel(pACB->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) 	if (!arcmsr_hbaE_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) 		pr_notice("arcmsr%d: wait 'stop adapter background rebuild' "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) 			"timeout\n", pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) 	case ACB_ADAPTER_TYPE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) 		arcmsr_hbaA_stop_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) 		arcmsr_hbaB_stop_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) 	case ACB_ADAPTER_TYPE_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) 		arcmsr_hbaC_stop_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) 		arcmsr_hbaD_stop_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) 		arcmsr_hbaE_stop_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) static void arcmsr_free_ccb_pool(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) 	dma_free_coherent(&acb->pdev->dev, acb->uncache_size, acb->dma_coherent, acb->dma_coherent_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) static void arcmsr_iop_message_read(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) 		writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) 		writel(ARCMSR_DRV2IOP_DATA_READ_OK, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) 		struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) 		writel(ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) 		struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) 		writel(ARCMSR_ARC1214_DRV2IOP_DATA_OUT_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) 			reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) 		struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) 		acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) 		writel(acb->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) static void arcmsr_iop_message_wrote(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) 		** push inbound doorbell tell iop, driver data write ok
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) 		** and wait reply on next hwinterrupt for next Qbuffer post
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) 		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) 		writel(ARCMSR_INBOUND_DRIVER_DATA_WRITE_OK, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) 		** push inbound doorbell tell iop, driver data write ok
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) 		** and wait reply on next hwinterrupt for next Qbuffer post
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) 		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) 		writel(ARCMSR_DRV2IOP_DATA_WRITE_OK, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) 		struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) 		** push inbound doorbell tell iop, driver data write ok
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) 		** and wait reply on next hwinterrupt for next Qbuffer post
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) 		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) 		writel(ARCMSR_HBCMU_DRV2IOP_DATA_WRITE_OK, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) 		struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) 		writel(ARCMSR_ARC1214_DRV2IOP_DATA_IN_READY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) 			reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) 		struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) 		acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_WRITE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) 		writel(acb->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) struct QBUFFER __iomem *arcmsr_get_iop_rqbuffer(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) 	struct QBUFFER __iomem *qbuffer = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) 		qbuffer = (struct QBUFFER __iomem *)&reg->message_rbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) 		qbuffer = (struct QBUFFER __iomem *)reg->message_rbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) 		struct MessageUnit_C __iomem *phbcmu = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) 		qbuffer = (struct QBUFFER __iomem *)&phbcmu->message_rbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) 		struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) 		qbuffer = (struct QBUFFER __iomem *)reg->message_rbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) 	case ACB_ADAPTER_TYPE_E: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) 		struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) 		qbuffer = (struct QBUFFER __iomem *)&reg->message_rbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) 		qbuffer = (struct QBUFFER __iomem *)acb->message_rbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) 	return qbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) static struct QBUFFER __iomem *arcmsr_get_iop_wqbuffer(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) 	struct QBUFFER __iomem *pqbuffer = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) 		pqbuffer = (struct QBUFFER __iomem *) &reg->message_wbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) 		struct MessageUnit_B  *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) 		pqbuffer = (struct QBUFFER __iomem *)reg->message_wbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) 		struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) 		pqbuffer = (struct QBUFFER __iomem *)&reg->message_wbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) 		struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) 		pqbuffer = (struct QBUFFER __iomem *)reg->message_wbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) 	case ACB_ADAPTER_TYPE_E: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) 		struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) 		pqbuffer = (struct QBUFFER __iomem *)&reg->message_wbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) 		pqbuffer = (struct QBUFFER __iomem *)acb->message_wbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) 	return pqbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) static uint32_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) arcmsr_Read_iop_rqbuffer_in_DWORD(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) 		struct QBUFFER __iomem *prbuffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) 	uint8_t *pQbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) 	uint8_t *buf1 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) 	uint32_t __iomem *iop_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) 	uint32_t iop_len, data_len, *buf2 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) 	iop_data = (uint32_t __iomem *)prbuffer->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) 	iop_len = readl(&prbuffer->data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) 	if (iop_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) 		buf1 = kmalloc(128, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) 		buf2 = (uint32_t *)buf1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) 		if (buf1 == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) 		data_len = iop_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) 		while (data_len >= 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) 			*buf2++ = readl(iop_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) 			iop_data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) 			data_len -= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) 		if (data_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) 			*buf2 = readl(iop_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) 		buf2 = (uint32_t *)buf1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) 	while (iop_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) 		pQbuffer = &acb->rqbuffer[acb->rqbuf_putIndex];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) 		*pQbuffer = *buf1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) 		acb->rqbuf_putIndex++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) 		/* if last, index number set it to 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) 		acb->rqbuf_putIndex %= ARCMSR_MAX_QBUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) 		buf1++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) 		iop_len--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) 	kfree(buf2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) 	/* let IOP know data has been read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) 	arcmsr_iop_message_read(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) uint32_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) arcmsr_Read_iop_rqbuffer_data(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) 	struct QBUFFER __iomem *prbuffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) 	uint8_t *pQbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) 	uint8_t __iomem *iop_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) 	uint32_t iop_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) 	if (acb->adapter_type > ACB_ADAPTER_TYPE_B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) 		return arcmsr_Read_iop_rqbuffer_in_DWORD(acb, prbuffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) 	iop_data = (uint8_t __iomem *)prbuffer->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) 	iop_len = readl(&prbuffer->data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) 	while (iop_len > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) 		pQbuffer = &acb->rqbuffer[acb->rqbuf_putIndex];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) 		*pQbuffer = readb(iop_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) 		acb->rqbuf_putIndex++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) 		acb->rqbuf_putIndex %= ARCMSR_MAX_QBUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) 		iop_data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) 		iop_len--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) 	arcmsr_iop_message_read(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) static void arcmsr_iop2drv_data_wrote_handle(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) 	struct QBUFFER __iomem  *prbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) 	int32_t buf_empty_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) 	spin_lock_irqsave(&acb->rqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) 	prbuffer = arcmsr_get_iop_rqbuffer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) 	buf_empty_len = (acb->rqbuf_putIndex - acb->rqbuf_getIndex - 1) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) 		(ARCMSR_MAX_QBUFFER - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) 	if (buf_empty_len >= readl(&prbuffer->data_len)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) 		if (arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) 			acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) 		acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) 	spin_unlock_irqrestore(&acb->rqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) static void arcmsr_write_ioctldata2iop_in_DWORD(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) 	uint8_t *pQbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) 	struct QBUFFER __iomem *pwbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) 	uint8_t *buf1 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) 	uint32_t __iomem *iop_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) 	uint32_t allxfer_len = 0, data_len, *buf2 = NULL, data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) 	if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) 		buf1 = kmalloc(128, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) 		buf2 = (uint32_t *)buf1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) 		if (buf1 == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) 		acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) 		pwbuffer = arcmsr_get_iop_wqbuffer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) 		iop_data = (uint32_t __iomem *)pwbuffer->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) 		while ((acb->wqbuf_getIndex != acb->wqbuf_putIndex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) 			&& (allxfer_len < 124)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) 			pQbuffer = &acb->wqbuffer[acb->wqbuf_getIndex];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) 			*buf1 = *pQbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) 			acb->wqbuf_getIndex++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) 			acb->wqbuf_getIndex %= ARCMSR_MAX_QBUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) 			buf1++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) 			allxfer_len++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) 		data_len = allxfer_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) 		buf1 = (uint8_t *)buf2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) 		while (data_len >= 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) 			data = *buf2++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) 			writel(data, iop_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) 			iop_data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) 			data_len -= 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) 		if (data_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) 			data = *buf2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) 			writel(data, iop_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) 		writel(allxfer_len, &pwbuffer->data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) 		kfree(buf1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) 		arcmsr_iop_message_wrote(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) arcmsr_write_ioctldata2iop(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) 	uint8_t *pQbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) 	struct QBUFFER __iomem *pwbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) 	uint8_t __iomem *iop_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) 	int32_t allxfer_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) 	if (acb->adapter_type > ACB_ADAPTER_TYPE_B) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) 		arcmsr_write_ioctldata2iop_in_DWORD(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) 	if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_READED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) 		acb->acb_flags &= (~ACB_F_MESSAGE_WQBUFFER_READED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) 		pwbuffer = arcmsr_get_iop_wqbuffer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) 		iop_data = (uint8_t __iomem *)pwbuffer->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) 		while ((acb->wqbuf_getIndex != acb->wqbuf_putIndex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) 			&& (allxfer_len < 124)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) 			pQbuffer = &acb->wqbuffer[acb->wqbuf_getIndex];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) 			writeb(*pQbuffer, iop_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) 			acb->wqbuf_getIndex++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) 			acb->wqbuf_getIndex %= ARCMSR_MAX_QBUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) 			iop_data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) 			allxfer_len++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) 		writel(allxfer_len, &pwbuffer->data_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) 		arcmsr_iop_message_wrote(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) static void arcmsr_iop2drv_data_read_handle(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) 	spin_lock_irqsave(&acb->wqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) 	acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_READED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) 	if (acb->wqbuf_getIndex != acb->wqbuf_putIndex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) 		arcmsr_write_ioctldata2iop(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) 	if (acb->wqbuf_getIndex == acb->wqbuf_putIndex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) 		acb->acb_flags |= ACB_F_MESSAGE_WQBUFFER_CLEARED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) 	spin_unlock_irqrestore(&acb->wqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) static void arcmsr_hbaA_doorbell_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) 	uint32_t outbound_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) 	struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) 	outbound_doorbell = readl(&reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) 		writel(outbound_doorbell, &reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) 		if (outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_WRITE_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) 			arcmsr_iop2drv_data_wrote_handle(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) 		if (outbound_doorbell & ARCMSR_OUTBOUND_IOP331_DATA_READ_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) 			arcmsr_iop2drv_data_read_handle(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) 		outbound_doorbell = readl(&reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) 	} while (outbound_doorbell & (ARCMSR_OUTBOUND_IOP331_DATA_WRITE_OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) 		| ARCMSR_OUTBOUND_IOP331_DATA_READ_OK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) static void arcmsr_hbaC_doorbell_isr(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) 	uint32_t outbound_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) 	struct MessageUnit_C __iomem *reg = pACB->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) 	*******************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) 	**  Maybe here we need to check wrqbuffer_lock is lock or not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) 	**  DOORBELL: din! don!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) 	**  check if there are any mail need to pack from firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) 	*******************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) 	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) 	outbound_doorbell = readl(&reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) 		writel(outbound_doorbell, &reg->outbound_doorbell_clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) 		readl(&reg->outbound_doorbell_clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) 		if (outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_DATA_WRITE_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) 			arcmsr_iop2drv_data_wrote_handle(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) 		if (outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_DATA_READ_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) 			arcmsr_iop2drv_data_read_handle(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) 		if (outbound_doorbell & ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) 			arcmsr_hbaC_message_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) 		outbound_doorbell = readl(&reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) 	} while (outbound_doorbell & (ARCMSR_HBCMU_IOP2DRV_DATA_WRITE_OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) 		| ARCMSR_HBCMU_IOP2DRV_DATA_READ_OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) 		| ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) static void arcmsr_hbaD_doorbell_isr(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) 	uint32_t outbound_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) 	struct MessageUnit_D  *pmu = pACB->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) 	outbound_doorbell = readl(pmu->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) 		writel(outbound_doorbell, pmu->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) 		if (outbound_doorbell & ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) 			arcmsr_hbaD_message_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) 		if (outbound_doorbell & ARCMSR_ARC1214_IOP2DRV_DATA_WRITE_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) 			arcmsr_iop2drv_data_wrote_handle(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) 		if (outbound_doorbell & ARCMSR_ARC1214_IOP2DRV_DATA_READ_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) 			arcmsr_iop2drv_data_read_handle(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) 		outbound_doorbell = readl(pmu->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) 	} while (outbound_doorbell & (ARCMSR_ARC1214_IOP2DRV_DATA_WRITE_OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) 		| ARCMSR_ARC1214_IOP2DRV_DATA_READ_OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) 		| ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) static void arcmsr_hbaE_doorbell_isr(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) 	uint32_t outbound_doorbell, in_doorbell, tmp, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) 	struct MessageUnit_E __iomem *reg = pACB->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) 	if (pACB->adapter_type == ACB_ADAPTER_TYPE_F) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) 		for (i = 0; i < 5; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) 			in_doorbell = readl(&reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) 			if (in_doorbell != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) 		in_doorbell = readl(&reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) 	outbound_doorbell = in_doorbell ^ pACB->in_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) 		writel(0, &reg->host_int_status); /* clear interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) 		if (outbound_doorbell & ARCMSR_HBEMU_IOP2DRV_DATA_WRITE_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) 			arcmsr_iop2drv_data_wrote_handle(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) 		if (outbound_doorbell & ARCMSR_HBEMU_IOP2DRV_DATA_READ_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) 			arcmsr_iop2drv_data_read_handle(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) 		if (outbound_doorbell & ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) 			arcmsr_hbaE_message_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) 		tmp = in_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) 		in_doorbell = readl(&reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) 		outbound_doorbell = tmp ^ in_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) 	} while (outbound_doorbell & (ARCMSR_HBEMU_IOP2DRV_DATA_WRITE_OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) 		| ARCMSR_HBEMU_IOP2DRV_DATA_READ_OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) 		| ARCMSR_HBEMU_IOP2DRV_MESSAGE_CMD_DONE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) 	pACB->in_doorbell = in_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) static void arcmsr_hbaA_postqueue_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) 	uint32_t flag_ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) 	struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) 	struct ARCMSR_CDB *pARCMSR_CDB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) 	struct CommandControlBlock *pCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) 	bool error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) 	unsigned long cdb_phy_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) 	while ((flag_ccb = readl(&reg->outbound_queueport)) != 0xFFFFFFFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) 		cdb_phy_addr = (flag_ccb << 5) & 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) 		if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) 			cdb_phy_addr = cdb_phy_addr | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) 		pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + cdb_phy_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) 		pCCB = container_of(pARCMSR_CDB, struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) 		error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) 		arcmsr_drain_donequeue(acb, pCCB, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) static void arcmsr_hbaB_postqueue_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) 	uint32_t index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) 	uint32_t flag_ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) 	struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) 	struct ARCMSR_CDB *pARCMSR_CDB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) 	struct CommandControlBlock *pCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) 	bool error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) 	unsigned long cdb_phy_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) 	index = reg->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) 	while ((flag_ccb = reg->done_qbuffer[index]) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) 		cdb_phy_addr = (flag_ccb << 5) & 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) 		if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) 			cdb_phy_addr = cdb_phy_addr | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) 		pARCMSR_CDB = (struct ARCMSR_CDB *)(acb->vir2phy_offset + cdb_phy_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) 		pCCB = container_of(pARCMSR_CDB, struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) 		error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) 		arcmsr_drain_donequeue(acb, pCCB, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) 		reg->done_qbuffer[index] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) 		index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) 		index %= ARCMSR_MAX_HBB_POSTQUEUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) 		reg->doneq_index = index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) static void arcmsr_hbaC_postqueue_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) 	struct MessageUnit_C __iomem *phbcmu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) 	struct ARCMSR_CDB *arcmsr_cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) 	struct CommandControlBlock *ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) 	uint32_t flag_ccb, throttling = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) 	unsigned long ccb_cdb_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) 	phbcmu = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) 	/* areca cdb command done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) 	/* Use correct offset and size for syncing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) 	while ((flag_ccb = readl(&phbcmu->outbound_queueport_low)) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) 			0xFFFFFFFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) 		ccb_cdb_phy = (flag_ccb & 0xFFFFFFF0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) 		if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) 			ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) 		arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) 			+ ccb_cdb_phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) 		ccb = container_of(arcmsr_cdb, struct CommandControlBlock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) 			arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) 		error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) 			? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) 		/* check if command done with no error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) 		arcmsr_drain_donequeue(acb, ccb, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) 		throttling++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) 		if (throttling == ARCMSR_HBC_ISR_THROTTLING_LEVEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) 			writel(ARCMSR_HBCMU_DRV2IOP_POSTQUEUE_THROTTLING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) 				&phbcmu->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) 			throttling = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) static void arcmsr_hbaD_postqueue_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) 	u32 outbound_write_pointer, doneq_index, index_stripped, toggle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) 	uint32_t addressLow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) 	struct MessageUnit_D  *pmu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) 	struct ARCMSR_CDB *arcmsr_cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) 	struct CommandControlBlock *ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) 	unsigned long flags, ccb_cdb_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) 	spin_lock_irqsave(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) 	pmu = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) 	outbound_write_pointer = pmu->done_qbuffer[0].addressLow + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) 	doneq_index = pmu->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) 	if ((doneq_index & 0xFFF) != (outbound_write_pointer & 0xFFF)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) 			toggle = doneq_index & 0x4000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) 			index_stripped = (doneq_index & 0xFFF) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) 			index_stripped %= ARCMSR_MAX_ARC1214_DONEQUEUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) 			pmu->doneq_index = index_stripped ? (index_stripped | toggle) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) 				((toggle ^ 0x4000) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) 			doneq_index = pmu->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) 			addressLow = pmu->done_qbuffer[doneq_index &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) 				0xFFF].addressLow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) 			ccb_cdb_phy = (addressLow & 0xFFFFFFF0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) 			if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) 				ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) 			arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) 				+ ccb_cdb_phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) 			ccb = container_of(arcmsr_cdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) 				struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) 			error = (addressLow & ARCMSR_CCBREPLY_FLAG_ERROR_MODE1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) 				? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) 			arcmsr_drain_donequeue(acb, ccb, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) 			writel(doneq_index, pmu->outboundlist_read_pointer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) 		} while ((doneq_index & 0xFFF) !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) 			(outbound_write_pointer & 0xFFF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) 	writel(ARCMSR_ARC1214_OUTBOUND_LIST_INTERRUPT_CLEAR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) 		pmu->outboundlist_interrupt_cause);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) 	readl(pmu->outboundlist_interrupt_cause);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) 	spin_unlock_irqrestore(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) static void arcmsr_hbaE_postqueue_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) 	uint32_t doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) 	uint16_t cmdSMID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) 	struct MessageUnit_E __iomem *pmu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) 	struct CommandControlBlock *ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) 	spin_lock_irqsave(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) 	doneq_index = acb->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) 	pmu = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) 	while ((readl(&pmu->reply_post_producer_index) & 0xFFFF) != doneq_index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) 		cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) 		ccb = acb->pccb_pool[cmdSMID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) 		error = (acb->pCompletionQ[doneq_index].cmdFlag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) 			& ARCMSR_CCBREPLY_FLAG_ERROR_MODE1) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) 		arcmsr_drain_donequeue(acb, ccb, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) 		doneq_index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) 		if (doneq_index >= acb->completionQ_entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) 			doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) 	acb->doneq_index = doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) 	writel(doneq_index, &pmu->reply_post_consumer_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) 	spin_unlock_irqrestore(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) static void arcmsr_hbaF_postqueue_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) 	uint32_t doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) 	uint16_t cmdSMID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) 	struct MessageUnit_F __iomem *phbcmu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) 	struct CommandControlBlock *ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) 	spin_lock_irqsave(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) 	doneq_index = acb->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) 	phbcmu = acb->pmuF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) 	while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) 		cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) 		if (cmdSMID == 0xffff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) 		ccb = acb->pccb_pool[cmdSMID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) 		error = (acb->pCompletionQ[doneq_index].cmdFlag &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) 			ARCMSR_CCBREPLY_FLAG_ERROR_MODE1) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) 		arcmsr_drain_donequeue(acb, ccb, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) 		acb->pCompletionQ[doneq_index].cmdSMID = 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) 		doneq_index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) 		if (doneq_index >= acb->completionQ_entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) 			doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) 	acb->doneq_index = doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) 	writel(doneq_index, &phbcmu->reply_post_consumer_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) 	spin_unlock_irqrestore(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) **********************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) ** Handle a message interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) ** The only message interrupt we expect is in response to a query for the current adapter config.  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) ** We want this in order to compare the drivemap so that we can detect newly-attached drives.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) **********************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) static void arcmsr_hbaA_message_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) 	struct MessageUnit_A __iomem *reg  = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) 	/*clear interrupt and message state*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) 	writel(ARCMSR_MU_OUTBOUND_MESSAGE0_INT, &reg->outbound_intstatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) 	if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) 		schedule_work(&acb->arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) static void arcmsr_hbaB_message_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) 	struct MessageUnit_B *reg  = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) 	/*clear interrupt and message state*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) 	writel(ARCMSR_MESSAGE_INT_CLEAR_PATTERN, reg->iop2drv_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) 	if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) 		schedule_work(&acb->arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) **********************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) ** Handle a message interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) **
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) ** The only message interrupt we expect is in response to a query for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) ** current adapter config.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) ** We want this in order to compare the drivemap so that we can detect newly-attached drives.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) **********************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) static void arcmsr_hbaC_message_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) 	struct MessageUnit_C __iomem *reg  = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) 	/*clear interrupt and message state*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) 	writel(ARCMSR_HBCMU_IOP2DRV_MESSAGE_CMD_DONE_DOORBELL_CLEAR, &reg->outbound_doorbell_clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) 	if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) 		schedule_work(&acb->arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) static void arcmsr_hbaD_message_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) 	struct MessageUnit_D *reg  = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) 	writel(ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE, reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) 	readl(reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) 	if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) 		schedule_work(&acb->arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) static void arcmsr_hbaE_message_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) 	struct MessageUnit_E __iomem *reg  = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) 	writel(0, &reg->host_int_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) 	if (acb->acb_flags & ACB_F_MSG_GET_CONFIG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) 		schedule_work(&acb->arcmsr_do_message_isr_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) static int arcmsr_hbaA_handle_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) 	uint32_t outbound_intstatus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) 	struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) 	outbound_intstatus = readl(&reg->outbound_intstatus) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) 		acb->outbound_int_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) 	if (!(outbound_intstatus & ARCMSR_MU_OUTBOUND_HANDLE_INT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) 		return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) 		writel(outbound_intstatus, &reg->outbound_intstatus);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) 		if (outbound_intstatus & ARCMSR_MU_OUTBOUND_DOORBELL_INT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) 			arcmsr_hbaA_doorbell_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) 		if (outbound_intstatus & ARCMSR_MU_OUTBOUND_POSTQUEUE_INT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) 			arcmsr_hbaA_postqueue_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) 		if (outbound_intstatus & ARCMSR_MU_OUTBOUND_MESSAGE0_INT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) 			arcmsr_hbaA_message_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) 		outbound_intstatus = readl(&reg->outbound_intstatus) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) 			acb->outbound_int_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) 	} while (outbound_intstatus & (ARCMSR_MU_OUTBOUND_DOORBELL_INT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) 		| ARCMSR_MU_OUTBOUND_POSTQUEUE_INT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) 		| ARCMSR_MU_OUTBOUND_MESSAGE0_INT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) static int arcmsr_hbaB_handle_isr(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) 	uint32_t outbound_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) 	struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) 	outbound_doorbell = readl(reg->iop2drv_doorbell) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) 				acb->outbound_int_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) 	if (!outbound_doorbell)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) 		return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) 		writel(~outbound_doorbell, reg->iop2drv_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) 		writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) 		if (outbound_doorbell & ARCMSR_IOP2DRV_DATA_WRITE_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) 			arcmsr_iop2drv_data_wrote_handle(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) 		if (outbound_doorbell & ARCMSR_IOP2DRV_DATA_READ_OK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) 			arcmsr_iop2drv_data_read_handle(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) 		if (outbound_doorbell & ARCMSR_IOP2DRV_CDB_DONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) 			arcmsr_hbaB_postqueue_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) 		if (outbound_doorbell & ARCMSR_IOP2DRV_MESSAGE_CMD_DONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) 			arcmsr_hbaB_message_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) 		outbound_doorbell = readl(reg->iop2drv_doorbell) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) 			acb->outbound_int_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) 	} while (outbound_doorbell & (ARCMSR_IOP2DRV_DATA_WRITE_OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) 		| ARCMSR_IOP2DRV_DATA_READ_OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) 		| ARCMSR_IOP2DRV_CDB_DONE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) 		| ARCMSR_IOP2DRV_MESSAGE_CMD_DONE));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) static int arcmsr_hbaC_handle_isr(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) 	uint32_t host_interrupt_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) 	struct MessageUnit_C __iomem *phbcmu = pACB->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) 	*********************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) 	**   check outbound intstatus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) 	*********************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) 	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) 	host_interrupt_status = readl(&phbcmu->host_int_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) 		(ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) 		ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) 	if (!host_interrupt_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) 		return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) 		if (host_interrupt_status & ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) 			arcmsr_hbaC_doorbell_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) 		/* MU post queue interrupts*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) 		if (host_interrupt_status & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) 			arcmsr_hbaC_postqueue_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) 		host_interrupt_status = readl(&phbcmu->host_int_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) 	} while (host_interrupt_status & (ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) 		ARCMSR_HBCMU_OUTBOUND_DOORBELL_ISR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) static irqreturn_t arcmsr_hbaD_handle_isr(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) 	u32 host_interrupt_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) 	struct MessageUnit_D  *pmu = pACB->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) 	host_interrupt_status = readl(pmu->host_int_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) 		(ARCMSR_ARC1214_OUTBOUND_POSTQUEUE_ISR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) 		ARCMSR_ARC1214_OUTBOUND_DOORBELL_ISR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) 	if (!host_interrupt_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) 		return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) 		/* MU post queue interrupts*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) 		if (host_interrupt_status &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) 			ARCMSR_ARC1214_OUTBOUND_POSTQUEUE_ISR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) 			arcmsr_hbaD_postqueue_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) 		if (host_interrupt_status &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) 			ARCMSR_ARC1214_OUTBOUND_DOORBELL_ISR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) 			arcmsr_hbaD_doorbell_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) 		host_interrupt_status = readl(pmu->host_int_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) 	} while (host_interrupt_status &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) 		(ARCMSR_ARC1214_OUTBOUND_POSTQUEUE_ISR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) 		ARCMSR_ARC1214_OUTBOUND_DOORBELL_ISR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) static irqreturn_t arcmsr_hbaE_handle_isr(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) 	uint32_t host_interrupt_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) 	struct MessageUnit_E __iomem *pmu = pACB->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) 	host_interrupt_status = readl(&pmu->host_int_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) 		(ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) 		ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) 	if (!host_interrupt_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) 		return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) 		/* MU ioctl transfer doorbell interrupts*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) 		if (host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) 			arcmsr_hbaE_doorbell_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) 		/* MU post queue interrupts*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) 		if (host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) 			arcmsr_hbaE_postqueue_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) 		host_interrupt_status = readl(&pmu->host_int_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) 	} while (host_interrupt_status & (ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) 		ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) static irqreturn_t arcmsr_hbaF_handle_isr(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) 	uint32_t host_interrupt_status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) 	struct MessageUnit_F __iomem *phbcmu = pACB->pmuF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) 	host_interrupt_status = readl(&phbcmu->host_int_status) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) 		(ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) 		ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) 	if (!host_interrupt_status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) 		return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) 		/* MU post queue interrupts*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) 		if (host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843) 			arcmsr_hbaF_postqueue_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) 		/* MU ioctl transfer doorbell interrupts*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) 		if (host_interrupt_status & ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) 			arcmsr_hbaE_doorbell_isr(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) 		host_interrupt_status = readl(&phbcmu->host_int_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) 	} while (host_interrupt_status & (ARCMSR_HBEMU_OUTBOUND_POSTQUEUE_ISR |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) 		ARCMSR_HBEMU_OUTBOUND_DOORBELL_ISR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) 	return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) static irqreturn_t arcmsr_interrupt(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) 	case ACB_ADAPTER_TYPE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) 		return arcmsr_hbaA_handle_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) 		return arcmsr_hbaB_handle_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) 	case ACB_ADAPTER_TYPE_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) 		return arcmsr_hbaC_handle_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) 		return arcmsr_hbaD_handle_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) 		return arcmsr_hbaE_handle_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) 		return arcmsr_hbaF_handle_isr(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) 		return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) static void arcmsr_iop_parking(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) 	if (acb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) 		/* stop adapter background rebuild */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) 		if (acb->acb_flags & ACB_F_MSG_START_BGRB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) 			uint32_t intmask_org;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) 			acb->acb_flags &= ~ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) 			intmask_org = arcmsr_disable_outbound_ints(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) 			arcmsr_stop_adapter_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) 			arcmsr_flush_adapter_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) 			arcmsr_enable_outbound_ints(acb, intmask_org);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) void arcmsr_clear_iop2drv_rqueue_buffer(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) 	uint32_t	i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) 	if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) 		for (i = 0; i < 15; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) 			if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) 				acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) 				acb->rqbuf_getIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) 				acb->rqbuf_putIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) 				arcmsr_iop_message_read(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) 				mdelay(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) 			} else if (acb->rqbuf_getIndex !=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) 				   acb->rqbuf_putIndex) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) 				acb->rqbuf_getIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) 				acb->rqbuf_putIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) 				mdelay(30);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) 			} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) 		struct scsi_cmnd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) 	char *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) 	unsigned short use_sg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) 	int retvalue = 0, transfer_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) 	struct CMD_MESSAGE_FIELD *pcmdmessagefld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) 	uint32_t controlcode = (uint32_t)cmd->cmnd[5] << 24 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) 		(uint32_t)cmd->cmnd[6] << 16 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) 		(uint32_t)cmd->cmnd[7] << 8 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) 		(uint32_t)cmd->cmnd[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) 	struct scatterlist *sg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) 	use_sg = scsi_sg_count(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) 	sg = scsi_sglist(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) 	buffer = kmap_atomic(sg_page(sg)) + sg->offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) 	if (use_sg > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) 		retvalue = ARCMSR_MESSAGE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) 		goto message_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) 	transfer_len += sg->length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) 	if (transfer_len > sizeof(struct CMD_MESSAGE_FIELD)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) 		retvalue = ARCMSR_MESSAGE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) 		pr_info("%s: ARCMSR_MESSAGE_FAIL!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) 		goto message_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) 	pcmdmessagefld = (struct CMD_MESSAGE_FIELD *)buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) 	switch (controlcode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) 	case ARCMSR_MESSAGE_READ_RQBUFFER: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) 		unsigned char *ver_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) 		uint8_t *ptmpQbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) 		uint32_t allxfer_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) 		ver_addr = kmalloc(ARCMSR_API_DATA_BUFLEN, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) 		if (!ver_addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) 			retvalue = ARCMSR_MESSAGE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) 			pr_info("%s: memory not enough!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) 			goto message_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) 		ptmpQbuffer = ver_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) 		spin_lock_irqsave(&acb->rqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) 		if (acb->rqbuf_getIndex != acb->rqbuf_putIndex) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) 			unsigned int tail = acb->rqbuf_getIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) 			unsigned int head = acb->rqbuf_putIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) 			unsigned int cnt_to_end = CIRC_CNT_TO_END(head, tail, ARCMSR_MAX_QBUFFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) 			allxfer_len = CIRC_CNT(head, tail, ARCMSR_MAX_QBUFFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) 			if (allxfer_len > ARCMSR_API_DATA_BUFLEN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) 				allxfer_len = ARCMSR_API_DATA_BUFLEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) 			if (allxfer_len <= cnt_to_end)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) 				memcpy(ptmpQbuffer, acb->rqbuffer + tail, allxfer_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) 			else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) 				memcpy(ptmpQbuffer, acb->rqbuffer + tail, cnt_to_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) 				memcpy(ptmpQbuffer + cnt_to_end, acb->rqbuffer, allxfer_len - cnt_to_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) 			acb->rqbuf_getIndex = (acb->rqbuf_getIndex + allxfer_len) % ARCMSR_MAX_QBUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) 		memcpy(pcmdmessagefld->messagedatabuffer, ver_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) 			allxfer_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) 		if (acb->acb_flags & ACB_F_IOPDATA_OVERFLOW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) 			struct QBUFFER __iomem *prbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) 			acb->acb_flags &= ~ACB_F_IOPDATA_OVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) 			prbuffer = arcmsr_get_iop_rqbuffer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) 			if (arcmsr_Read_iop_rqbuffer_data(acb, prbuffer) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) 				acb->acb_flags |= ACB_F_IOPDATA_OVERFLOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) 		spin_unlock_irqrestore(&acb->rqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) 		kfree(ver_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) 		pcmdmessagefld->cmdmessage.Length = allxfer_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) 		if (acb->fw_flag == FW_DEADLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) 				ARCMSR_MESSAGE_RETURNCODE_BUS_HANG_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) 				ARCMSR_MESSAGE_RETURNCODE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) 	case ARCMSR_MESSAGE_WRITE_WQBUFFER: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) 		unsigned char *ver_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) 		uint32_t user_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) 		int32_t cnt2end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) 		uint8_t *pQbuffer, *ptmpuserbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) 		user_len = pcmdmessagefld->cmdmessage.Length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) 		if (user_len > ARCMSR_API_DATA_BUFLEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) 			retvalue = ARCMSR_MESSAGE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) 			goto message_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) 		ver_addr = kmalloc(ARCMSR_API_DATA_BUFLEN, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) 		if (!ver_addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) 			retvalue = ARCMSR_MESSAGE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) 			goto message_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) 		ptmpuserbuffer = ver_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) 		memcpy(ptmpuserbuffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) 			pcmdmessagefld->messagedatabuffer, user_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) 		spin_lock_irqsave(&acb->wqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) 		if (acb->wqbuf_putIndex != acb->wqbuf_getIndex) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) 			struct SENSE_DATA *sensebuffer =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) 				(struct SENSE_DATA *)cmd->sense_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) 			arcmsr_write_ioctldata2iop(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) 			/* has error report sensedata */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) 			sensebuffer->ErrorCode = SCSI_SENSE_CURRENT_ERRORS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) 			sensebuffer->SenseKey = ILLEGAL_REQUEST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) 			sensebuffer->AdditionalSenseLength = 0x0A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) 			sensebuffer->AdditionalSenseCode = 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) 			sensebuffer->Valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) 			retvalue = ARCMSR_MESSAGE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) 			pQbuffer = &acb->wqbuffer[acb->wqbuf_putIndex];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) 			cnt2end = ARCMSR_MAX_QBUFFER - acb->wqbuf_putIndex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) 			if (user_len > cnt2end) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) 				memcpy(pQbuffer, ptmpuserbuffer, cnt2end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) 				ptmpuserbuffer += cnt2end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) 				user_len -= cnt2end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) 				acb->wqbuf_putIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) 				pQbuffer = acb->wqbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) 			memcpy(pQbuffer, ptmpuserbuffer, user_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) 			acb->wqbuf_putIndex += user_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) 			acb->wqbuf_putIndex %= ARCMSR_MAX_QBUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) 			if (acb->acb_flags & ACB_F_MESSAGE_WQBUFFER_CLEARED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) 				acb->acb_flags &=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) 						~ACB_F_MESSAGE_WQBUFFER_CLEARED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) 				arcmsr_write_ioctldata2iop(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) 		spin_unlock_irqrestore(&acb->wqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) 		kfree(ver_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) 		if (acb->fw_flag == FW_DEADLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) 				ARCMSR_MESSAGE_RETURNCODE_BUS_HANG_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) 				ARCMSR_MESSAGE_RETURNCODE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) 	case ARCMSR_MESSAGE_CLEAR_RQBUFFER: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) 		uint8_t *pQbuffer = acb->rqbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) 		arcmsr_clear_iop2drv_rqueue_buffer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) 		spin_lock_irqsave(&acb->rqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) 		acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) 		acb->rqbuf_getIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) 		acb->rqbuf_putIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) 		memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) 		spin_unlock_irqrestore(&acb->rqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) 		if (acb->fw_flag == FW_DEADLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) 				ARCMSR_MESSAGE_RETURNCODE_BUS_HANG_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) 				ARCMSR_MESSAGE_RETURNCODE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) 	case ARCMSR_MESSAGE_CLEAR_WQBUFFER: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) 		uint8_t *pQbuffer = acb->wqbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) 		spin_lock_irqsave(&acb->wqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) 		acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) 			ACB_F_MESSAGE_WQBUFFER_READED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) 		acb->wqbuf_getIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) 		acb->wqbuf_putIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) 		memset(pQbuffer, 0, ARCMSR_MAX_QBUFFER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) 		spin_unlock_irqrestore(&acb->wqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) 		if (acb->fw_flag == FW_DEADLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) 				ARCMSR_MESSAGE_RETURNCODE_BUS_HANG_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) 				ARCMSR_MESSAGE_RETURNCODE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) 	case ARCMSR_MESSAGE_CLEAR_ALLQBUFFER: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) 		uint8_t *pQbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) 		arcmsr_clear_iop2drv_rqueue_buffer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) 		spin_lock_irqsave(&acb->rqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) 		acb->acb_flags |= ACB_F_MESSAGE_RQBUFFER_CLEARED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) 		acb->rqbuf_getIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) 		acb->rqbuf_putIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) 		pQbuffer = acb->rqbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) 		memset(pQbuffer, 0, sizeof(struct QBUFFER));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) 		spin_unlock_irqrestore(&acb->rqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) 		spin_lock_irqsave(&acb->wqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) 		acb->acb_flags |= (ACB_F_MESSAGE_WQBUFFER_CLEARED |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) 			ACB_F_MESSAGE_WQBUFFER_READED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) 		acb->wqbuf_getIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) 		acb->wqbuf_putIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) 		pQbuffer = acb->wqbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) 		memset(pQbuffer, 0, sizeof(struct QBUFFER));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) 		spin_unlock_irqrestore(&acb->wqbuffer_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) 		if (acb->fw_flag == FW_DEADLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) 				ARCMSR_MESSAGE_RETURNCODE_BUS_HANG_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) 				ARCMSR_MESSAGE_RETURNCODE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) 	case ARCMSR_MESSAGE_RETURN_CODE_3F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) 		if (acb->fw_flag == FW_DEADLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) 				ARCMSR_MESSAGE_RETURNCODE_BUS_HANG_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) 				ARCMSR_MESSAGE_RETURNCODE_3F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) 	case ARCMSR_MESSAGE_SAY_HELLO: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) 		int8_t *hello_string = "Hello! I am ARCMSR";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) 		if (acb->fw_flag == FW_DEADLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) 				ARCMSR_MESSAGE_RETURNCODE_BUS_HANG_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) 				ARCMSR_MESSAGE_RETURNCODE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) 		memcpy(pcmdmessagefld->messagedatabuffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) 			hello_string, (int16_t)strlen(hello_string));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) 	case ARCMSR_MESSAGE_SAY_GOODBYE: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) 		if (acb->fw_flag == FW_DEADLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) 				ARCMSR_MESSAGE_RETURNCODE_BUS_HANG_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) 				ARCMSR_MESSAGE_RETURNCODE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) 		arcmsr_iop_parking(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) 	case ARCMSR_MESSAGE_FLUSH_ADAPTER_CACHE: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) 		if (acb->fw_flag == FW_DEADLOCK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) 				ARCMSR_MESSAGE_RETURNCODE_BUS_HANG_ON;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) 			pcmdmessagefld->cmdmessage.ReturnCode =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) 				ARCMSR_MESSAGE_RETURNCODE_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) 		arcmsr_flush_adapter_cache(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) 		retvalue = ARCMSR_MESSAGE_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) 		pr_info("%s: unknown controlcode!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) message_out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) 	if (use_sg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) 		struct scatterlist *sg = scsi_sglist(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) 		kunmap_atomic(buffer - sg->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) 	return retvalue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) static struct CommandControlBlock *arcmsr_get_freeccb(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) 	struct list_head *head = &acb->ccb_free_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) 	struct CommandControlBlock *ccb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) 	spin_lock_irqsave(&acb->ccblist_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) 	if (!list_empty(head)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) 		ccb = list_entry(head->next, struct CommandControlBlock, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) 		list_del_init(&ccb->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) 	}else{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) 		spin_unlock_irqrestore(&acb->ccblist_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) 	spin_unlock_irqrestore(&acb->ccblist_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) 	return ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) static void arcmsr_handle_virtual_command(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) 		struct scsi_cmnd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) 	switch (cmd->cmnd[0]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) 	case INQUIRY: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) 		unsigned char inqdata[36];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) 		char *buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) 		struct scatterlist *sg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) 		if (cmd->device->lun) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) 			cmd->result = (DID_TIME_OUT << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) 			cmd->scsi_done(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) 		inqdata[0] = TYPE_PROCESSOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) 		/* Periph Qualifier & Periph Dev Type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) 		inqdata[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) 		/* rem media bit & Dev Type Modifier */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) 		inqdata[2] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) 		/* ISO, ECMA, & ANSI versions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) 		inqdata[4] = 31;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) 		/* length of additional data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) 		strncpy(&inqdata[8], "Areca   ", 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) 		/* Vendor Identification */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) 		strncpy(&inqdata[16], "RAID controller ", 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) 		/* Product Identification */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) 		strncpy(&inqdata[32], "R001", 4); /* Product Revision */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) 		sg = scsi_sglist(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) 		buffer = kmap_atomic(sg_page(sg)) + sg->offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) 		memcpy(buffer, inqdata, sizeof(inqdata));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) 		sg = scsi_sglist(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) 		kunmap_atomic(buffer - sg->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) 		cmd->scsi_done(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) 	break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) 	case WRITE_BUFFER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) 	case READ_BUFFER: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) 		if (arcmsr_iop_message_xfer(acb, cmd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) 			cmd->result = (DID_ERROR << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) 		cmd->scsi_done(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) 	break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) 		cmd->scsi_done(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) static int arcmsr_queue_command_lck(struct scsi_cmnd *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) 	void (* done)(struct scsi_cmnd *))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) 	struct Scsi_Host *host = cmd->device->host;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) 	struct AdapterControlBlock *acb = (struct AdapterControlBlock *) host->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) 	struct CommandControlBlock *ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) 	int target = cmd->device->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) 	if (acb->acb_flags & ACB_F_ADAPTER_REMOVED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) 		cmd->result = (DID_NO_CONNECT << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) 		cmd->scsi_done(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) 	cmd->scsi_done = done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) 	cmd->host_scribble = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) 	cmd->result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) 	if (target == 16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) 		/* virtual device for iop message transfer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) 		arcmsr_handle_virtual_command(acb, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) 	ccb = arcmsr_get_freeccb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) 	if (!ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) 		return SCSI_MLQUEUE_HOST_BUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) 	if (arcmsr_build_ccb( acb, ccb, cmd ) == FAILED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) 		cmd->result = (DID_ERROR << 16) | (RESERVATION_CONFLICT << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) 		cmd->scsi_done(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) 	arcmsr_post_ccb(acb, ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) static DEF_SCSI_QCMD(arcmsr_queue_command)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) static void arcmsr_get_adapter_config(struct AdapterControlBlock *pACB, uint32_t *rwbuffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) 	int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) 	uint32_t *acb_firm_model = (uint32_t *)pACB->firm_model;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) 	uint32_t *acb_firm_version = (uint32_t *)pACB->firm_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) 	uint32_t *acb_device_map = (uint32_t *)pACB->device_map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) 	uint32_t *firm_model = &rwbuffer[15];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) 	uint32_t *firm_version = &rwbuffer[17];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) 	uint32_t *device_map = &rwbuffer[21];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) 	count = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) 	while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) 		*acb_firm_model = readl(firm_model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) 		acb_firm_model++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) 		firm_model++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) 		count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) 	count = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) 	while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) 		*acb_firm_version = readl(firm_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) 		acb_firm_version++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) 		firm_version++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) 		count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) 	count = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) 	while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) 		*acb_device_map = readl(device_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) 		acb_device_map++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) 		device_map++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) 		count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) 	pACB->signature = readl(&rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) 	pACB->firm_request_len = readl(&rwbuffer[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) 	pACB->firm_numbers_queue = readl(&rwbuffer[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) 	pACB->firm_sdram_size = readl(&rwbuffer[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) 	pACB->firm_hd_channels = readl(&rwbuffer[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) 	pACB->firm_cfg_version = readl(&rwbuffer[25]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) 	pr_notice("Areca RAID Controller%d: Model %s, F/W %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) 		pACB->host->host_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) 		pACB->firm_model,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) 		pACB->firm_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) static bool arcmsr_hbaA_get_config(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) 	struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) 	arcmsr_wait_firmware_ready(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) 	writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) 	if (!arcmsr_hbaA_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) 		printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) 			miscellaneous data' timeout \n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) 	arcmsr_get_adapter_config(acb, reg->message_rwbuffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) static bool arcmsr_hbaB_get_config(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) 	struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) 	arcmsr_wait_firmware_ready(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) 	writel(ARCMSR_MESSAGE_START_DRIVER_MODE, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) 	if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) 		printk(KERN_ERR "arcmsr%d: can't set driver mode.\n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) 	writel(ARCMSR_MESSAGE_GET_CONFIG, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) 	if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) 		printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) 			miscellaneous data' timeout \n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) 	arcmsr_get_adapter_config(acb, reg->message_rwbuffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) static bool arcmsr_hbaC_get_config(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) 	uint32_t intmask_org;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) 	struct MessageUnit_C __iomem *reg = pACB->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) 	/* disable all outbound interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) 	intmask_org = readl(&reg->host_int_mask); /* disable outbound message0 int */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) 	writel(intmask_org|ARCMSR_HBCMU_ALL_INTMASKENABLE, &reg->host_int_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) 	/* wait firmware ready */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) 	arcmsr_wait_firmware_ready(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) 	/* post "get config" instruction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) 	writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) 	writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) 	/* wait message ready */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) 	if (!arcmsr_hbaC_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) 		printk(KERN_NOTICE "arcmsr%d: wait 'get adapter firmware \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) 			miscellaneous data' timeout \n", pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) 	arcmsr_get_adapter_config(pACB, reg->msgcode_rwbuffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) static bool arcmsr_hbaD_get_config(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) 	struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) 	if (readl(acb->pmuD->outbound_doorbell) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) 		ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) 		writel(ARCMSR_ARC1214_IOP2DRV_MESSAGE_CMD_DONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) 			acb->pmuD->outbound_doorbell);/*clear interrupt*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) 	arcmsr_wait_firmware_ready(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) 	/* post "get config" instruction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) 	writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) 	/* wait message ready */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) 	if (!arcmsr_hbaD_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) 		pr_notice("arcmsr%d: wait get adapter firmware "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) 			"miscellaneous data timeout\n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) 	arcmsr_get_adapter_config(acb, reg->msgcode_rwbuffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) static bool arcmsr_hbaE_get_config(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) 	struct MessageUnit_E __iomem *reg = pACB->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) 	uint32_t intmask_org;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) 	/* disable all outbound interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) 	intmask_org = readl(&reg->host_int_mask); /* disable outbound message0 int */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) 	writel(intmask_org | ARCMSR_HBEMU_ALL_INTMASKENABLE, &reg->host_int_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) 	/* wait firmware ready */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) 	arcmsr_wait_firmware_ready(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) 	mdelay(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) 	/* post "get config" instruction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) 	writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) 	pACB->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) 	writel(pACB->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) 	/* wait message ready */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) 	if (!arcmsr_hbaE_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) 		pr_notice("arcmsr%d: wait get adapter firmware "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) 			"miscellaneous data timeout\n", pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) 	arcmsr_get_adapter_config(pACB, reg->msgcode_rwbuffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) static bool arcmsr_hbaF_get_config(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) 	struct MessageUnit_F __iomem *reg = pACB->pmuF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) 	uint32_t intmask_org;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) 	/* disable all outbound interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) 	intmask_org = readl(&reg->host_int_mask); /* disable outbound message0 int */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) 	writel(intmask_org | ARCMSR_HBEMU_ALL_INTMASKENABLE, &reg->host_int_mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) 	/* wait firmware ready */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) 	arcmsr_wait_firmware_ready(pACB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) 	/* post "get config" instruction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) 	writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) 	pACB->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) 	writel(pACB->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) 	/* wait message ready */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) 	if (!arcmsr_hbaE_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) 		pr_notice("arcmsr%d: wait get adapter firmware miscellaneous data timeout\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) 			  pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) 	arcmsr_get_adapter_config(pACB, pACB->msgcode_rwbuffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) static bool arcmsr_get_firmware_spec(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) 	bool rtn = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) 	case ACB_ADAPTER_TYPE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) 		rtn = arcmsr_hbaA_get_config(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) 		rtn = arcmsr_hbaB_get_config(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) 	case ACB_ADAPTER_TYPE_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) 		rtn = arcmsr_hbaC_get_config(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) 		rtn = arcmsr_hbaD_get_config(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) 		rtn = arcmsr_hbaE_get_config(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) 		rtn = arcmsr_hbaF_get_config(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) 	acb->maxOutstanding = acb->firm_numbers_queue - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) 	if (acb->host->can_queue >= acb->firm_numbers_queue)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) 		acb->host->can_queue = acb->maxOutstanding;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) 		acb->maxOutstanding = acb->host->can_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) 	acb->maxFreeCCB = acb->host->can_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) 	if (acb->maxFreeCCB < ARCMSR_MAX_FREECCB_NUM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) 		acb->maxFreeCCB += 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) static int arcmsr_hbaA_polling_ccbdone(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) 	struct CommandControlBlock *poll_ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) 	struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484) 	struct CommandControlBlock *ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) 	struct ARCMSR_CDB *arcmsr_cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) 	uint32_t flag_ccb, outbound_intstatus, poll_ccb_done = 0, poll_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) 	int rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) 	bool error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) 	unsigned long ccb_cdb_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) polling_hba_ccb_retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) 	poll_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) 	outbound_intstatus = readl(&reg->outbound_intstatus) & acb->outbound_int_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) 	writel(outbound_intstatus, &reg->outbound_intstatus);/*clear interrupt*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495) 	while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) 		if ((flag_ccb = readl(&reg->outbound_queueport)) == 0xFFFFFFFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) 			if (poll_ccb_done){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) 				rtn = SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) 			}else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) 				msleep(25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) 				if (poll_count > 100){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) 					rtn = FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) 				goto polling_hba_ccb_retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) 		ccb_cdb_phy = (flag_ccb << 5) & 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510) 		if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) 			ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) 		arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) 		ccb = container_of(arcmsr_cdb, struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514) 		poll_ccb_done |= (ccb == poll_ccb) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) 		if ((ccb->acb != acb) || (ccb->startdone != ARCMSR_CCB_START)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) 			if ((ccb->startdone == ARCMSR_CCB_ABORTED) || (ccb == poll_ccb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) 				printk(KERN_NOTICE "arcmsr%d: scsi id = %d lun = %d ccb = '0x%p'"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) 					" poll command abort successfully \n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) 					, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) 					, ccb->pcmd->device->id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) 					, (u32)ccb->pcmd->device->lun
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) 					, ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) 				ccb->pcmd->result = DID_ABORT << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) 				arcmsr_ccb_complete(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) 			printk(KERN_NOTICE "arcmsr%d: polling get an illegal ccb"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) 				" command done ccb = '0x%p'"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) 				"ccboutstandingcount = %d \n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) 				, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) 				, ccb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) 				, atomic_read(&acb->ccboutstandingcount));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) 		error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) 		arcmsr_report_ccb_state(acb, ccb, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) static int arcmsr_hbaB_polling_ccbdone(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) 					struct CommandControlBlock *poll_ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) 	struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) 	struct ARCMSR_CDB *arcmsr_cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) 	struct CommandControlBlock *ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) 	uint32_t flag_ccb, poll_ccb_done = 0, poll_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) 	int index, rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) 	bool error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550) 	unsigned long ccb_cdb_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) polling_hbb_ccb_retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) 	poll_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554) 	/* clear doorbell interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) 	writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, reg->iop2drv_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) 	while(1){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) 		index = reg->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) 		flag_ccb = reg->done_qbuffer[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) 		if (flag_ccb == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) 			if (poll_ccb_done){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) 				rtn = SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563) 			}else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) 				msleep(25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) 				if (poll_count > 100){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) 					rtn = FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) 				goto polling_hbb_ccb_retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) 		reg->done_qbuffer[index] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573) 		index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) 		/*if last index number set it to 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575) 		index %= ARCMSR_MAX_HBB_POSTQUEUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) 		reg->doneq_index = index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) 		/* check if command done with no error*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) 		ccb_cdb_phy = (flag_ccb << 5) & 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) 		if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580) 			ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) 		arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) 		ccb = container_of(arcmsr_cdb, struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) 		poll_ccb_done |= (ccb == poll_ccb) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) 		if ((ccb->acb != acb) || (ccb->startdone != ARCMSR_CCB_START)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) 			if ((ccb->startdone == ARCMSR_CCB_ABORTED) || (ccb == poll_ccb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586) 				printk(KERN_NOTICE "arcmsr%d: scsi id = %d lun = %d ccb = '0x%p'"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) 					" poll command abort successfully \n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) 					,acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589) 					,ccb->pcmd->device->id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) 					,(u32)ccb->pcmd->device->lun
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) 					,ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592) 				ccb->pcmd->result = DID_ABORT << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) 				arcmsr_ccb_complete(ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596) 			printk(KERN_NOTICE "arcmsr%d: polling get an illegal ccb"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) 				" command done ccb = '0x%p'"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) 				"ccboutstandingcount = %d \n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) 				, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) 				, ccb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) 				, atomic_read(&acb->ccboutstandingcount));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603) 		} 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604) 		error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE0) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605) 		arcmsr_report_ccb_state(acb, ccb, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610) static int arcmsr_hbaC_polling_ccbdone(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) 		struct CommandControlBlock *poll_ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613) 	struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614) 	uint32_t flag_ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615) 	struct ARCMSR_CDB *arcmsr_cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616) 	bool error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) 	struct CommandControlBlock *pCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618) 	uint32_t poll_ccb_done = 0, poll_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619) 	int rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620) 	unsigned long ccb_cdb_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622) polling_hbc_ccb_retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623) 	poll_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624) 	while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625) 		if ((readl(&reg->host_int_status) & ARCMSR_HBCMU_OUTBOUND_POSTQUEUE_ISR) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) 			if (poll_ccb_done) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627) 				rtn = SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) 				msleep(25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631) 				if (poll_count > 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) 					rtn = FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635) 				goto polling_hbc_ccb_retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638) 		flag_ccb = readl(&reg->outbound_queueport_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) 		ccb_cdb_phy = (flag_ccb & 0xFFFFFFF0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640) 		if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641) 			ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) 		arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643) 		pCCB = container_of(arcmsr_cdb, struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644) 		poll_ccb_done |= (pCCB == poll_ccb) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645) 		/* check ifcommand done with no error*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) 		if ((pCCB->acb != acb) || (pCCB->startdone != ARCMSR_CCB_START)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647) 			if (pCCB->startdone == ARCMSR_CCB_ABORTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648) 				printk(KERN_NOTICE "arcmsr%d: scsi id = %d lun = %d ccb = '0x%p'"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649) 					" poll command abort successfully \n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650) 					, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651) 					, pCCB->pcmd->device->id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) 					, (u32)pCCB->pcmd->device->lun
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653) 					, pCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654) 				pCCB->pcmd->result = DID_ABORT << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) 				arcmsr_ccb_complete(pCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658) 			printk(KERN_NOTICE "arcmsr%d: polling get an illegal ccb"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659) 				" command done ccb = '0x%p'"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660) 				"ccboutstandingcount = %d \n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661) 				, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662) 				, pCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663) 				, atomic_read(&acb->ccboutstandingcount));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666) 		error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE1) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) 		arcmsr_report_ccb_state(acb, pCCB, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672) static int arcmsr_hbaD_polling_ccbdone(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673) 				struct CommandControlBlock *poll_ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675) 	bool error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) 	uint32_t poll_ccb_done = 0, poll_count = 0, flag_ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677) 	int rtn, doneq_index, index_stripped, outbound_write_pointer, toggle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678) 	unsigned long flags, ccb_cdb_phy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) 	struct ARCMSR_CDB *arcmsr_cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680) 	struct CommandControlBlock *pCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) 	struct MessageUnit_D *pmu = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) polling_hbaD_ccb_retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684) 	poll_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685) 	while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686) 		spin_lock_irqsave(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687) 		outbound_write_pointer = pmu->done_qbuffer[0].addressLow + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688) 		doneq_index = pmu->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689) 		if ((outbound_write_pointer & 0xFFF) == (doneq_index & 0xFFF)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690) 			spin_unlock_irqrestore(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691) 			if (poll_ccb_done) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692) 				rtn = SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695) 				msleep(25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696) 				if (poll_count > 40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697) 					rtn = FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700) 				goto polling_hbaD_ccb_retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703) 		toggle = doneq_index & 0x4000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704) 		index_stripped = (doneq_index & 0xFFF) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705) 		index_stripped %= ARCMSR_MAX_ARC1214_DONEQUEUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706) 		pmu->doneq_index = index_stripped ? (index_stripped | toggle) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707) 				((toggle ^ 0x4000) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708) 		doneq_index = pmu->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709) 		spin_unlock_irqrestore(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710) 		flag_ccb = pmu->done_qbuffer[doneq_index & 0xFFF].addressLow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711) 		ccb_cdb_phy = (flag_ccb & 0xFFFFFFF0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712) 		if (acb->cdb_phyadd_hipart)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713) 			ccb_cdb_phy = ccb_cdb_phy | acb->cdb_phyadd_hipart;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714) 		arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715) 			ccb_cdb_phy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716) 		pCCB = container_of(arcmsr_cdb, struct CommandControlBlock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717) 			arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718) 		poll_ccb_done |= (pCCB == poll_ccb) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719) 		if ((pCCB->acb != acb) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) 			(pCCB->startdone != ARCMSR_CCB_START)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721) 			if (pCCB->startdone == ARCMSR_CCB_ABORTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722) 				pr_notice("arcmsr%d: scsi id = %d "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723) 					"lun = %d ccb = '0x%p' poll command "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) 					"abort successfully\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725) 					, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) 					, pCCB->pcmd->device->id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727) 					, (u32)pCCB->pcmd->device->lun
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728) 					, pCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729) 				pCCB->pcmd->result = DID_ABORT << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730) 				arcmsr_ccb_complete(pCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733) 			pr_notice("arcmsr%d: polling an illegal "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) 				"ccb command done ccb = '0x%p' "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735) 				"ccboutstandingcount = %d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) 				, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) 				, pCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738) 				, atomic_read(&acb->ccboutstandingcount));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741) 		error = (flag_ccb & ARCMSR_CCBREPLY_FLAG_ERROR_MODE1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742) 			? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743) 		arcmsr_report_ccb_state(acb, pCCB, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) static int arcmsr_hbaE_polling_ccbdone(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749) 				struct CommandControlBlock *poll_ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751) 	bool error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752) 	uint32_t poll_ccb_done = 0, poll_count = 0, doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753) 	uint16_t cmdSMID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755) 	int rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756) 	struct CommandControlBlock *pCCB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757) 	struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759) 	polling_hbaC_ccb_retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) 	poll_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) 	while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762) 		spin_lock_irqsave(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) 		doneq_index = acb->doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) 		if ((readl(&reg->reply_post_producer_index) & 0xFFFF) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765) 				doneq_index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766) 			spin_unlock_irqrestore(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767) 			if (poll_ccb_done) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768) 				rtn = SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771) 				msleep(25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772) 				if (poll_count > 40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) 					rtn = FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774) 					break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776) 				goto polling_hbaC_ccb_retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779) 		cmdSMID = acb->pCompletionQ[doneq_index].cmdSMID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780) 		doneq_index++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781) 		if (doneq_index >= acb->completionQ_entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782) 			doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783) 		acb->doneq_index = doneq_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784) 		spin_unlock_irqrestore(&acb->doneq_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785) 		pCCB = acb->pccb_pool[cmdSMID];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) 		poll_ccb_done |= (pCCB == poll_ccb) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787) 		/* check if command done with no error*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788) 		if ((pCCB->acb != acb) || (pCCB->startdone != ARCMSR_CCB_START)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789) 			if (pCCB->startdone == ARCMSR_CCB_ABORTED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790) 				pr_notice("arcmsr%d: scsi id = %d "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791) 					"lun = %d ccb = '0x%p' poll command "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792) 					"abort successfully\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) 					, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794) 					, pCCB->pcmd->device->id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795) 					, (u32)pCCB->pcmd->device->lun
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796) 					, pCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) 				pCCB->pcmd->result = DID_ABORT << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798) 				arcmsr_ccb_complete(pCCB);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801) 			pr_notice("arcmsr%d: polling an illegal "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) 				"ccb command done ccb = '0x%p' "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803) 				"ccboutstandingcount = %d\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) 				, acb->host->host_no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805) 				, pCCB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806) 				, atomic_read(&acb->ccboutstandingcount));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809) 		error = (acb->pCompletionQ[doneq_index].cmdFlag &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810) 			ARCMSR_CCBREPLY_FLAG_ERROR_MODE1) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811) 		arcmsr_report_ccb_state(acb, pCCB, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) 	writel(doneq_index, &reg->reply_post_consumer_index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817) static int arcmsr_polling_ccbdone(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) 					struct CommandControlBlock *poll_ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) 	int rtn = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823) 	case ACB_ADAPTER_TYPE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) 		rtn = arcmsr_hbaA_polling_ccbdone(acb, poll_ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) 		rtn = arcmsr_hbaB_polling_ccbdone(acb, poll_ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) 	case ACB_ADAPTER_TYPE_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830) 		rtn = arcmsr_hbaC_polling_ccbdone(acb, poll_ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833) 		rtn = arcmsr_hbaD_polling_ccbdone(acb, poll_ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837) 		rtn = arcmsr_hbaE_polling_ccbdone(acb, poll_ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843) static void arcmsr_set_iop_datetime(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845) 	struct AdapterControlBlock *pacb = from_timer(pacb, t, refresh_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) 	unsigned int next_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847) 	struct tm tm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850) 		struct	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851) 		uint16_t	signature;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852) 		uint8_t		year;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853) 		uint8_t		month;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854) 		uint8_t		date;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855) 		uint8_t		hour;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856) 		uint8_t		minute;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) 		uint8_t		second;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858) 		} a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) 		struct	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860) 		uint32_t	msg_time[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861) 		} b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862) 	} datetime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864) 	time64_to_tm(ktime_get_real_seconds(), -sys_tz.tz_minuteswest * 60, &tm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866) 	datetime.a.signature = 0x55AA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) 	datetime.a.year = tm.tm_year - 100; /* base 2000 instead of 1900 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868) 	datetime.a.month = tm.tm_mon;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) 	datetime.a.date = tm.tm_mday;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870) 	datetime.a.hour = tm.tm_hour;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871) 	datetime.a.minute = tm.tm_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872) 	datetime.a.second = tm.tm_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874) 	switch (pacb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875) 		case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) 			struct MessageUnit_A __iomem *reg = pacb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877) 			writel(datetime.b.msg_time[0], &reg->message_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) 			writel(datetime.b.msg_time[1], &reg->message_rwbuffer[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879) 			writel(ARCMSR_INBOUND_MESG0_SYNC_TIMER, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) 		case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883) 			uint32_t __iomem *rwbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) 			struct MessageUnit_B *reg = pacb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885) 			rwbuffer = reg->message_rwbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) 			writel(datetime.b.msg_time[0], rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887) 			writel(datetime.b.msg_time[1], rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) 			writel(ARCMSR_MESSAGE_SYNC_TIMER, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) 		case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892) 			struct MessageUnit_C __iomem *reg = pacb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893) 			writel(datetime.b.msg_time[0], &reg->msgcode_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894) 			writel(datetime.b.msg_time[1], &reg->msgcode_rwbuffer[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895) 			writel(ARCMSR_INBOUND_MESG0_SYNC_TIMER, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896) 			writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899) 		case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) 			uint32_t __iomem *rwbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901) 			struct MessageUnit_D *reg = pacb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902) 			rwbuffer = reg->msgcode_rwbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) 			writel(datetime.b.msg_time[0], rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904) 			writel(datetime.b.msg_time[1], rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905) 			writel(ARCMSR_INBOUND_MESG0_SYNC_TIMER, reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908) 		case ACB_ADAPTER_TYPE_E: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) 			struct MessageUnit_E __iomem *reg = pacb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) 			writel(datetime.b.msg_time[0], &reg->msgcode_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911) 			writel(datetime.b.msg_time[1], &reg->msgcode_rwbuffer[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912) 			writel(ARCMSR_INBOUND_MESG0_SYNC_TIMER, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913) 			pacb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914) 			writel(pacb->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917) 		case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918) 			struct MessageUnit_F __iomem *reg = pacb->pmuF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920) 			pacb->msgcode_rwbuffer[0] = datetime.b.msg_time[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921) 			pacb->msgcode_rwbuffer[1] = datetime.b.msg_time[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922) 			writel(ARCMSR_INBOUND_MESG0_SYNC_TIMER, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) 			pacb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924) 			writel(pacb->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928) 	if (sys_tz.tz_minuteswest)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929) 		next_time = ARCMSR_HOURS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931) 		next_time = ARCMSR_MINUTES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932) 	mod_timer(&pacb->refresh_timer, jiffies + msecs_to_jiffies(next_time));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935) static int arcmsr_iop_confirm(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937) 	uint32_t cdb_phyaddr, cdb_phyaddr_hi32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938) 	dma_addr_t dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941) 	********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942) 	** here we need to tell iop 331 our freeccb.HighPart
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943) 	** if freeccb.HighPart is not zero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944) 	********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) 	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949) 		dma_coherent_handle = acb->dma_coherent_handle2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953) 		dma_coherent_handle = acb->dma_coherent_handle +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954) 			offsetof(struct CommandControlBlock, arcmsr_cdb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) 		dma_coherent_handle = acb->dma_coherent_handle;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) 	cdb_phyaddr = lower_32_bits(dma_coherent_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) 	cdb_phyaddr_hi32 = upper_32_bits(dma_coherent_handle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) 	acb->cdb_phyaddr_hi32 = cdb_phyaddr_hi32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963) 	acb->cdb_phyadd_hipart = ((uint64_t)cdb_phyaddr_hi32) << 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965) 	***********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966) 	**    if adapter type B, set window of "post command Q"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967) 	***********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) 	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972) 		if (cdb_phyaddr_hi32 != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) 			struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) 			writel(ARCMSR_SIGNATURE_SET_CONFIG, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975) 						&reg->message_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976) 			writel(cdb_phyaddr_hi32, &reg->message_rwbuffer[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977) 			writel(ARCMSR_INBOUND_MESG0_SET_CONFIG, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978) 							&reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979) 			if (!arcmsr_hbaA_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980) 				printk(KERN_NOTICE "arcmsr%d: ""set ccb high \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981) 				part physical address timeout\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982) 				acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983) 				return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990) 		uint32_t __iomem *rwbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993) 		reg->postq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994) 		reg->doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995) 		writel(ARCMSR_MESSAGE_SET_POST_WINDOW, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996) 		if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997) 			printk(KERN_NOTICE "arcmsr%d: cannot set driver mode\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998) 				acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001) 		rwbuffer = reg->message_rwbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002) 		/* driver "set config" signature */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003) 		writel(ARCMSR_SIGNATURE_SET_CONFIG, rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004) 		/* normal should be zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005) 		writel(cdb_phyaddr_hi32, rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006) 		/* postQ size (256 + 8)*4	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007) 		writel(cdb_phyaddr, rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008) 		/* doneQ size (256 + 8)*4	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) 		writel(cdb_phyaddr + 1056, rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) 		/* ccb maxQ size must be --> [(256 + 8)*4]*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011) 		writel(1056, rwbuffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013) 		writel(ARCMSR_MESSAGE_SET_CONFIG, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) 		if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) 			printk(KERN_NOTICE "arcmsr%d: 'set command Q window' \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016) 			timeout \n",acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) 		writel(ARCMSR_MESSAGE_START_DRIVER_MODE, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020) 		if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) 			pr_err("arcmsr%d: can't set driver mode.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022) 				acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) 			struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030) 			printk(KERN_NOTICE "arcmsr%d: cdb_phyaddr_hi32=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) 					acb->adapter_index, cdb_phyaddr_hi32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) 			writel(ARCMSR_SIGNATURE_SET_CONFIG, &reg->msgcode_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033) 			writel(cdb_phyaddr_hi32, &reg->msgcode_rwbuffer[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) 			writel(ARCMSR_INBOUND_MESG0_SET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035) 			writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036) 			if (!arcmsr_hbaC_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037) 				printk(KERN_NOTICE "arcmsr%d: 'set command Q window' \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038) 				timeout \n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039) 				return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044) 		uint32_t __iomem *rwbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045) 		struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046) 		reg->postq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047) 		reg->doneq_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) 		rwbuffer = reg->msgcode_rwbuffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049) 		writel(ARCMSR_SIGNATURE_SET_CONFIG, rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) 		writel(cdb_phyaddr_hi32, rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051) 		writel(cdb_phyaddr, rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052) 		writel(cdb_phyaddr + (ARCMSR_MAX_ARC1214_POSTQUEUE *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) 			sizeof(struct InBound_SRB)), rwbuffer++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054) 		writel(0x100, rwbuffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055) 		writel(ARCMSR_INBOUND_MESG0_SET_CONFIG, reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056) 		if (!arcmsr_hbaD_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) 			pr_notice("arcmsr%d: 'set command Q window' timeout\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058) 				acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063) 	case ACB_ADAPTER_TYPE_E: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) 		struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065) 		writel(ARCMSR_SIGNATURE_SET_CONFIG, &reg->msgcode_rwbuffer[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066) 		writel(ARCMSR_SIGNATURE_1884, &reg->msgcode_rwbuffer[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067) 		writel(cdb_phyaddr, &reg->msgcode_rwbuffer[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068) 		writel(cdb_phyaddr_hi32, &reg->msgcode_rwbuffer[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069) 		writel(acb->ccbsize, &reg->msgcode_rwbuffer[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070) 		writel(lower_32_bits(acb->dma_coherent_handle2), &reg->msgcode_rwbuffer[5]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) 		writel(upper_32_bits(acb->dma_coherent_handle2), &reg->msgcode_rwbuffer[6]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) 		writel(acb->ioqueue_size, &reg->msgcode_rwbuffer[7]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073) 		writel(ARCMSR_INBOUND_MESG0_SET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074) 		acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) 		writel(acb->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076) 		if (!arcmsr_hbaE_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077) 			pr_notice("arcmsr%d: 'set command Q window' timeout \n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078) 				acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084) 		struct MessageUnit_F __iomem *reg = acb->pmuF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086) 		acb->msgcode_rwbuffer[0] = ARCMSR_SIGNATURE_SET_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087) 		acb->msgcode_rwbuffer[1] = ARCMSR_SIGNATURE_1886;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088) 		acb->msgcode_rwbuffer[2] = cdb_phyaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089) 		acb->msgcode_rwbuffer[3] = cdb_phyaddr_hi32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090) 		acb->msgcode_rwbuffer[4] = acb->ccbsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091) 		acb->msgcode_rwbuffer[5] = lower_32_bits(acb->dma_coherent_handle2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092) 		acb->msgcode_rwbuffer[6] = upper_32_bits(acb->dma_coherent_handle2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093) 		acb->msgcode_rwbuffer[7] = acb->completeQ_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094) 		writel(ARCMSR_INBOUND_MESG0_SET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095) 		acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096) 		writel(acb->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097) 		if (!arcmsr_hbaE_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098) 			pr_notice("arcmsr%d: 'set command Q window' timeout\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099) 				acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108) static void arcmsr_wait_firmware_ready(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110) 	uint32_t firmware_state = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116) 			if (!(acb->acb_flags & ACB_F_IOP_INITED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117) 				msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118) 			firmware_state = readl(&reg->outbound_msgaddr1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119) 		} while ((firmware_state & ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126) 			if (!(acb->acb_flags & ACB_F_IOP_INITED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127) 				msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128) 			firmware_state = readl(reg->iop2drv_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129) 		} while ((firmware_state & ARCMSR_MESSAGE_FIRMWARE_OK) == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130) 		writel(ARCMSR_DRV2IOP_END_OF_INTERRUPT, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4132) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4133) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4134) 		struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4135) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4136) 			if (!(acb->acb_flags & ACB_F_IOP_INITED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4137) 				msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4138) 			firmware_state = readl(&reg->outbound_msgaddr1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4139) 		} while ((firmware_state & ARCMSR_HBCMU_MESSAGE_FIRMWARE_OK) == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4140) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4141) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4142) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4143) 		struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4144) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4145) 			if (!(acb->acb_flags & ACB_F_IOP_INITED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4146) 				msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4147) 			firmware_state = readl(reg->outbound_msgaddr1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4148) 		} while ((firmware_state &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4149) 			ARCMSR_ARC1214_MESSAGE_FIRMWARE_OK) == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4150) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4151) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4152) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4153) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4154) 		struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4155) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4156) 			if (!(acb->acb_flags & ACB_F_IOP_INITED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4157) 				msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4158) 			firmware_state = readl(&reg->outbound_msgaddr1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4159) 		} while ((firmware_state & ARCMSR_HBEMU_MESSAGE_FIRMWARE_OK) == 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4160) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4161) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4162) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4165) static void arcmsr_request_device_map(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4167) 	struct AdapterControlBlock *acb = from_timer(acb, t, eternal_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4168) 	if (acb->acb_flags & (ACB_F_MSG_GET_CONFIG | ACB_F_BUS_RESET | ACB_F_ABORT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4169) 		mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4170) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4171) 		acb->fw_flag = FW_NORMAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4172) 		switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4173) 		case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4174) 			struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4175) 			writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4176) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4177) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4178) 		case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4179) 			struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4180) 			writel(ARCMSR_MESSAGE_GET_CONFIG, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4181) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4182) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4183) 		case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4184) 			struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4185) 			writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4186) 			writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4187) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4188) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4189) 		case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4190) 			struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4191) 			writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4192) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4193) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4194) 		case ACB_ADAPTER_TYPE_E: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4195) 			struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4196) 			writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4197) 			acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4198) 			writel(acb->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4199) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4200) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4201) 		case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4202) 			struct MessageUnit_F __iomem *reg = acb->pmuF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4203) 			uint32_t outMsg1 = readl(&reg->outbound_msgaddr1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4205) 			if (!(outMsg1 & ARCMSR_HBFMU_MESSAGE_FIRMWARE_OK) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4206) 				(outMsg1 & ARCMSR_HBFMU_MESSAGE_NO_VOLUME_CHANGE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4207) 				goto nxt6s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4208) 			writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4209) 			acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4210) 			writel(acb->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4211) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4212) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4213) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4214) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4215) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4216) 		acb->acb_flags |= ACB_F_MSG_GET_CONFIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4217) nxt6s:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4218) 		mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4219) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4222) static void arcmsr_hbaA_start_bgrb(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4223) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4224) 	struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4225) 	acb->acb_flags |= ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4226) 	writel(ARCMSR_INBOUND_MESG0_START_BGRB, &reg->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4227) 	if (!arcmsr_hbaA_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4228) 		printk(KERN_NOTICE "arcmsr%d: wait 'start adapter background \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4229) 				rebuild' timeout \n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4230) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4233) static void arcmsr_hbaB_start_bgrb(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4235) 	struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4236) 	acb->acb_flags |= ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4237) 	writel(ARCMSR_MESSAGE_START_BGRB, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4238) 	if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4239) 		printk(KERN_NOTICE "arcmsr%d: wait 'start adapter background \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4240) 				rebuild' timeout \n",acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4241) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4244) static void arcmsr_hbaC_start_bgrb(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4246) 	struct MessageUnit_C __iomem *phbcmu = pACB->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4247) 	pACB->acb_flags |= ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4248) 	writel(ARCMSR_INBOUND_MESG0_START_BGRB, &phbcmu->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4249) 	writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &phbcmu->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4250) 	if (!arcmsr_hbaC_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4251) 		printk(KERN_NOTICE "arcmsr%d: wait 'start adapter background \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4252) 				rebuild' timeout \n", pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4253) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4254) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4257) static void arcmsr_hbaD_start_bgrb(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4258) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4259) 	struct MessageUnit_D *pmu = pACB->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4261) 	pACB->acb_flags |= ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4262) 	writel(ARCMSR_INBOUND_MESG0_START_BGRB, pmu->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4263) 	if (!arcmsr_hbaD_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4264) 		pr_notice("arcmsr%d: wait 'start adapter "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4265) 			"background rebuild' timeout\n", pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4266) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4267) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4269) static void arcmsr_hbaE_start_bgrb(struct AdapterControlBlock *pACB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4270) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4271) 	struct MessageUnit_E __iomem *pmu = pACB->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4273) 	pACB->acb_flags |= ACB_F_MSG_START_BGRB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4274) 	writel(ARCMSR_INBOUND_MESG0_START_BGRB, &pmu->inbound_msgaddr0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4275) 	pACB->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_MESSAGE_CMD_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4276) 	writel(pACB->out_doorbell, &pmu->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4277) 	if (!arcmsr_hbaE_wait_msgint_ready(pACB)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4278) 		pr_notice("arcmsr%d: wait 'start adapter "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4279) 			"background rebuild' timeout \n", pACB->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4280) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4283) static void arcmsr_start_adapter_bgrb(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4284) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4285) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4286) 	case ACB_ADAPTER_TYPE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4287) 		arcmsr_hbaA_start_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4288) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4289) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4290) 		arcmsr_hbaB_start_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4291) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4292) 	case ACB_ADAPTER_TYPE_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4293) 		arcmsr_hbaC_start_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4294) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4295) 	case ACB_ADAPTER_TYPE_D:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4296) 		arcmsr_hbaD_start_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4297) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4298) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4299) 	case ACB_ADAPTER_TYPE_F:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4300) 		arcmsr_hbaE_start_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4301) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4302) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4305) static void arcmsr_clear_doorbell_queue_buffer(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4307) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4308) 	case ACB_ADAPTER_TYPE_A: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4309) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4310) 		uint32_t outbound_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4311) 		/* empty doorbell Qbuffer if door bell ringed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4312) 		outbound_doorbell = readl(&reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4313) 		/*clear doorbell interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4314) 		writel(outbound_doorbell, &reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4315) 		writel(ARCMSR_INBOUND_DRIVER_DATA_READ_OK, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4316) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4317) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4319) 	case ACB_ADAPTER_TYPE_B: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4320) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4321) 		uint32_t outbound_doorbell, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4322) 		writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, reg->iop2drv_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4323) 		writel(ARCMSR_DRV2IOP_DATA_READ_OK, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4324) 		/* let IOP know data has been read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4325) 		for(i=0; i < 200; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4326) 			msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4327) 			outbound_doorbell = readl(reg->iop2drv_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4328) 			if( outbound_doorbell & ARCMSR_IOP2DRV_DATA_WRITE_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4329) 				writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, reg->iop2drv_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4330) 				writel(ARCMSR_DRV2IOP_DATA_READ_OK, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4331) 			} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4332) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4333) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4334) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4335) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4336) 	case ACB_ADAPTER_TYPE_C: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4337) 		struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4338) 		uint32_t outbound_doorbell, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4339) 		/* empty doorbell Qbuffer if door bell ringed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4340) 		outbound_doorbell = readl(&reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4341) 		writel(outbound_doorbell, &reg->outbound_doorbell_clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4342) 		writel(ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK, &reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4343) 		for (i = 0; i < 200; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4344) 			msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4345) 			outbound_doorbell = readl(&reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4346) 			if (outbound_doorbell &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4347) 				ARCMSR_HBCMU_IOP2DRV_DATA_WRITE_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4348) 				writel(outbound_doorbell,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4349) 					&reg->outbound_doorbell_clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4350) 				writel(ARCMSR_HBCMU_DRV2IOP_DATA_READ_OK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4351) 					&reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4352) 			} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4353) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4354) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4355) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4356) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4357) 	case ACB_ADAPTER_TYPE_D: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4358) 		struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4359) 		uint32_t outbound_doorbell, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4360) 		/* empty doorbell Qbuffer if door bell ringed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4361) 		outbound_doorbell = readl(reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4362) 		writel(outbound_doorbell, reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4363) 		writel(ARCMSR_ARC1214_DRV2IOP_DATA_OUT_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4364) 			reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4365) 		for (i = 0; i < 200; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4366) 			msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4367) 			outbound_doorbell = readl(reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4368) 			if (outbound_doorbell &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4369) 				ARCMSR_ARC1214_IOP2DRV_DATA_WRITE_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4370) 				writel(outbound_doorbell,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4371) 					reg->outbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4372) 				writel(ARCMSR_ARC1214_DRV2IOP_DATA_OUT_READ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4373) 					reg->inbound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4374) 			} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4375) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4376) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4377) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4378) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4379) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4380) 	case ACB_ADAPTER_TYPE_F: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4381) 		struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4382) 		uint32_t i, tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4384) 		acb->in_doorbell = readl(&reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4385) 		writel(0, &reg->host_int_status); /*clear interrupt*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4386) 		acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4387) 		writel(acb->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4388) 		for(i=0; i < 200; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4389) 			msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4390) 			tmp = acb->in_doorbell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4391) 			acb->in_doorbell = readl(&reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4392) 			if((tmp ^ acb->in_doorbell) & ARCMSR_HBEMU_IOP2DRV_DATA_WRITE_OK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4393) 				writel(0, &reg->host_int_status); /*clear interrupt*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4394) 				acb->out_doorbell ^= ARCMSR_HBEMU_DRV2IOP_DATA_READ_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4395) 				writel(acb->out_doorbell, &reg->iobound_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4396) 			} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4397) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4398) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4399) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4400) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4401) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4404) static void arcmsr_enable_eoi_mode(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4405) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4406) 	switch (acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4407) 	case ACB_ADAPTER_TYPE_A:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4408) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4409) 	case ACB_ADAPTER_TYPE_B:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4410) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4411) 			struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4412) 			writel(ARCMSR_MESSAGE_ACTIVE_EOI_MODE, reg->drv2iop_doorbell);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4413) 			if (!arcmsr_hbaB_wait_msgint_ready(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4414) 				printk(KERN_NOTICE "ARCMSR IOP enables EOI_MODE TIMEOUT");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4415) 				return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4416) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4417) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4418) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4419) 	case ACB_ADAPTER_TYPE_C:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4420) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4421) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4422) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4425) static void arcmsr_hardware_reset(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4426) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4427) 	uint8_t value[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4428) 	int i, count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4429) 	struct MessageUnit_A __iomem *pmuA = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4430) 	struct MessageUnit_C __iomem *pmuC = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4431) 	struct MessageUnit_D *pmuD = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4433) 	/* backup pci config data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4434) 	printk(KERN_NOTICE "arcmsr%d: executing hw bus reset .....\n", acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4435) 	for (i = 0; i < 64; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4436) 		pci_read_config_byte(acb->pdev, i, &value[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4437) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4438) 	/* hardware reset signal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4439) 	if (acb->dev_id == 0x1680) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4440) 		writel(ARCMSR_ARC1680_BUS_RESET, &pmuA->reserved1[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4441) 	} else if (acb->dev_id == 0x1880) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4442) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4443) 			count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4444) 			writel(0xF, &pmuC->write_sequence);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4445) 			writel(0x4, &pmuC->write_sequence);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4446) 			writel(0xB, &pmuC->write_sequence);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4447) 			writel(0x2, &pmuC->write_sequence);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4448) 			writel(0x7, &pmuC->write_sequence);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4449) 			writel(0xD, &pmuC->write_sequence);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4450) 		} while (((readl(&pmuC->host_diagnostic) & ARCMSR_ARC1880_DiagWrite_ENABLE) == 0) && (count < 5));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4451) 		writel(ARCMSR_ARC1880_RESET_ADAPTER, &pmuC->host_diagnostic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4452) 	} else if (acb->dev_id == 0x1884) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4453) 		struct MessageUnit_E __iomem *pmuE = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4454) 		do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4455) 			count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4456) 			writel(0x4, &pmuE->write_sequence_3xxx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4457) 			writel(0xB, &pmuE->write_sequence_3xxx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4458) 			writel(0x2, &pmuE->write_sequence_3xxx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4459) 			writel(0x7, &pmuE->write_sequence_3xxx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4460) 			writel(0xD, &pmuE->write_sequence_3xxx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4461) 			mdelay(10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4462) 		} while (((readl(&pmuE->host_diagnostic_3xxx) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4463) 			ARCMSR_ARC1884_DiagWrite_ENABLE) == 0) && (count < 5));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4464) 		writel(ARCMSR_ARC188X_RESET_ADAPTER, &pmuE->host_diagnostic_3xxx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4465) 	} else if (acb->dev_id == 0x1214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4466) 		writel(0x20, pmuD->reset_request);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4467) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4468) 		pci_write_config_byte(acb->pdev, 0x84, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4469) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4470) 	msleep(2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4471) 	/* write back pci config data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4472) 	for (i = 0; i < 64; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4473) 		pci_write_config_byte(acb->pdev, i, value[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4474) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4475) 	msleep(1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4476) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4479) static bool arcmsr_reset_in_progress(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4480) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4481) 	bool rtn = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4482) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4483) 	switch(acb->adapter_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4484) 	case ACB_ADAPTER_TYPE_A:{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4485) 		struct MessageUnit_A __iomem *reg = acb->pmuA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4486) 		rtn = ((readl(&reg->outbound_msgaddr1) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4487) 			ARCMSR_OUTBOUND_MESG1_FIRMWARE_OK) == 0) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4488) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4489) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4490) 	case ACB_ADAPTER_TYPE_B:{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4491) 		struct MessageUnit_B *reg = acb->pmuB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4492) 		rtn = ((readl(reg->iop2drv_doorbell) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4493) 			ARCMSR_MESSAGE_FIRMWARE_OK) == 0) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4494) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4495) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4496) 	case ACB_ADAPTER_TYPE_C:{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4497) 		struct MessageUnit_C __iomem *reg = acb->pmuC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4498) 		rtn = (readl(&reg->host_diagnostic) & 0x04) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4499) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4500) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4501) 	case ACB_ADAPTER_TYPE_D:{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4502) 		struct MessageUnit_D *reg = acb->pmuD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4503) 		rtn = ((readl(reg->sample_at_reset) & 0x80) == 0) ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4504) 			true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4505) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4506) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4507) 	case ACB_ADAPTER_TYPE_E:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4508) 	case ACB_ADAPTER_TYPE_F:{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4509) 		struct MessageUnit_E __iomem *reg = acb->pmuE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4510) 		rtn = (readl(&reg->host_diagnostic_3xxx) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4511) 			ARCMSR_ARC188X_RESET_ADAPTER) ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4512) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4513) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4514) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4515) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4517) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4518) static void arcmsr_iop_init(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4519) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4520) 	uint32_t intmask_org;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4521) 	/* disable all outbound interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4522) 	intmask_org = arcmsr_disable_outbound_ints(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4523) 	arcmsr_wait_firmware_ready(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4524) 	arcmsr_iop_confirm(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4525) 	/*start background rebuild*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4526) 	arcmsr_start_adapter_bgrb(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4527) 	/* empty doorbell Qbuffer if door bell ringed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4528) 	arcmsr_clear_doorbell_queue_buffer(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4529) 	arcmsr_enable_eoi_mode(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4530) 	/* enable outbound Post Queue,outbound doorbell Interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4531) 	arcmsr_enable_outbound_ints(acb, intmask_org);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4532) 	acb->acb_flags |= ACB_F_IOP_INITED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4535) static uint8_t arcmsr_iop_reset(struct AdapterControlBlock *acb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4536) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4537) 	struct CommandControlBlock *ccb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4538) 	uint32_t intmask_org;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4539) 	uint8_t rtnval = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4540) 	int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4541) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4543) 	if (atomic_read(&acb->ccboutstandingcount) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4544) 		/* disable all outbound interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4545) 		intmask_org = arcmsr_disable_outbound_ints(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4546) 		/* talk to iop 331 outstanding command aborted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4547) 		rtnval = arcmsr_abort_allcmd(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4548) 		/* clear all outbound posted Q */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4549) 		arcmsr_done4abort_postqueue(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4550) 		for (i = 0; i < acb->maxFreeCCB; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4551) 			ccb = acb->pccb_pool[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4552) 			if (ccb->startdone == ARCMSR_CCB_START) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4553) 				scsi_dma_unmap(ccb->pcmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4554) 				ccb->startdone = ARCMSR_CCB_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4555) 				ccb->ccb_flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4556) 				spin_lock_irqsave(&acb->ccblist_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4557) 				list_add_tail(&ccb->list, &acb->ccb_free_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4558) 				spin_unlock_irqrestore(&acb->ccblist_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4559) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4560) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4561) 		atomic_set(&acb->ccboutstandingcount, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4562) 		/* enable all outbound interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4563) 		arcmsr_enable_outbound_ints(acb, intmask_org);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4564) 		return rtnval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4565) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4566) 	return rtnval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4569) static int arcmsr_bus_reset(struct scsi_cmnd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4571) 	struct AdapterControlBlock *acb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4572) 	int retry_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4573) 	int rtn = FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4574) 	acb = (struct AdapterControlBlock *) cmd->device->host->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4575) 	if (acb->acb_flags & ACB_F_ADAPTER_REMOVED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4576) 		return SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4577) 	pr_notice("arcmsr: executing bus reset eh.....num_resets = %d,"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4578) 		" num_aborts = %d \n", acb->num_resets, acb->num_aborts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4579) 	acb->num_resets++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4580) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4581) 	if (acb->acb_flags & ACB_F_BUS_RESET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4582) 		long timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4583) 		pr_notice("arcmsr: there is a bus reset eh proceeding...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4584) 		timeout = wait_event_timeout(wait_q, (acb->acb_flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4585) 			& ACB_F_BUS_RESET) == 0, 220 * HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4586) 		if (timeout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4587) 			return SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4588) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4589) 	acb->acb_flags |= ACB_F_BUS_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4590) 	if (!arcmsr_iop_reset(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4591) 		arcmsr_hardware_reset(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4592) 		acb->acb_flags &= ~ACB_F_IOP_INITED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4593) wait_reset_done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4594) 		ssleep(ARCMSR_SLEEPTIME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4595) 		if (arcmsr_reset_in_progress(acb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4596) 			if (retry_count > ARCMSR_RETRYCOUNT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4597) 				acb->fw_flag = FW_DEADLOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4598) 				pr_notice("arcmsr%d: waiting for hw bus reset"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4599) 					" return, RETRY TERMINATED!!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4600) 					acb->host->host_no);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4601) 				return FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4602) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4603) 			retry_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4604) 			goto wait_reset_done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4605) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4606) 		arcmsr_iop_init(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4607) 		acb->fw_flag = FW_NORMAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4608) 		mod_timer(&acb->eternal_timer, jiffies +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4609) 			msecs_to_jiffies(6 * HZ));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4610) 		acb->acb_flags &= ~ACB_F_BUS_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4611) 		rtn = SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4612) 		pr_notice("arcmsr: scsi bus reset eh returns with success\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4613) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4614) 		acb->acb_flags &= ~ACB_F_BUS_RESET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4615) 		acb->fw_flag = FW_NORMAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4616) 		mod_timer(&acb->eternal_timer, jiffies +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4617) 			msecs_to_jiffies(6 * HZ));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4618) 		rtn = SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4619) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4620) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4623) static int arcmsr_abort_one_cmd(struct AdapterControlBlock *acb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4624) 		struct CommandControlBlock *ccb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4625) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4626) 	int rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4627) 	rtn = arcmsr_polling_ccbdone(acb, ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4628) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4630) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4631) static int arcmsr_abort(struct scsi_cmnd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4632) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4633) 	struct AdapterControlBlock *acb =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4634) 		(struct AdapterControlBlock *)cmd->device->host->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4635) 	int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4636) 	int rtn = FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4637) 	uint32_t intmask_org;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4638) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4639) 	if (acb->acb_flags & ACB_F_ADAPTER_REMOVED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4640) 		return SUCCESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4641) 	printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4642) 		"arcmsr%d: abort device command of scsi id = %d lun = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4643) 		acb->host->host_no, cmd->device->id, (u32)cmd->device->lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4644) 	acb->acb_flags |= ACB_F_ABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4645) 	acb->num_aborts++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4646) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4647) 	************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4648) 	** the all interrupt service routine is locked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4649) 	** we need to handle it as soon as possible and exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4650) 	************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4651) 	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4652) 	if (!atomic_read(&acb->ccboutstandingcount)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4653) 		acb->acb_flags &= ~ACB_F_ABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4654) 		return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4655) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4656) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4657) 	intmask_org = arcmsr_disable_outbound_ints(acb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4658) 	for (i = 0; i < acb->maxFreeCCB; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4659) 		struct CommandControlBlock *ccb = acb->pccb_pool[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4660) 		if (ccb->startdone == ARCMSR_CCB_START && ccb->pcmd == cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4661) 			ccb->startdone = ARCMSR_CCB_ABORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4662) 			rtn = arcmsr_abort_one_cmd(acb, ccb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4663) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4664) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4665) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4666) 	acb->acb_flags &= ~ACB_F_ABORT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4667) 	arcmsr_enable_outbound_ints(acb, intmask_org);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4668) 	return rtn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4669) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4670) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4671) static const char *arcmsr_info(struct Scsi_Host *host)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4672) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4673) 	struct AdapterControlBlock *acb =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4674) 		(struct AdapterControlBlock *) host->hostdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4675) 	static char buf[256];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4676) 	char *type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4677) 	int raid6 = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4678) 	switch (acb->pdev->device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4679) 	case PCI_DEVICE_ID_ARECA_1110:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4680) 	case PCI_DEVICE_ID_ARECA_1200:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4681) 	case PCI_DEVICE_ID_ARECA_1202:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4682) 	case PCI_DEVICE_ID_ARECA_1210:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4683) 		raid6 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4684) 		fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4685) 	case PCI_DEVICE_ID_ARECA_1120:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4686) 	case PCI_DEVICE_ID_ARECA_1130:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4687) 	case PCI_DEVICE_ID_ARECA_1160:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4688) 	case PCI_DEVICE_ID_ARECA_1170:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4689) 	case PCI_DEVICE_ID_ARECA_1201:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4690) 	case PCI_DEVICE_ID_ARECA_1203:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4691) 	case PCI_DEVICE_ID_ARECA_1220:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4692) 	case PCI_DEVICE_ID_ARECA_1230:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4693) 	case PCI_DEVICE_ID_ARECA_1260:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4694) 	case PCI_DEVICE_ID_ARECA_1270:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4695) 	case PCI_DEVICE_ID_ARECA_1280:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4696) 		type = "SATA";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4697) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4698) 	case PCI_DEVICE_ID_ARECA_1214:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4699) 	case PCI_DEVICE_ID_ARECA_1380:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4700) 	case PCI_DEVICE_ID_ARECA_1381:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4701) 	case PCI_DEVICE_ID_ARECA_1680:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4702) 	case PCI_DEVICE_ID_ARECA_1681:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4703) 	case PCI_DEVICE_ID_ARECA_1880:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4704) 	case PCI_DEVICE_ID_ARECA_1884:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4705) 		type = "SAS/SATA";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4706) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4707) 	case PCI_DEVICE_ID_ARECA_1886:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4708) 		type = "NVMe/SAS/SATA";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4709) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4710) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4711) 		type = "unknown";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4712) 		raid6 =	0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4713) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4714) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4715) 	sprintf(buf, "Areca %s RAID Controller %s\narcmsr version %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4716) 		type, raid6 ? "(RAID6 capable)" : "", ARCMSR_DRIVER_VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4717) 	return buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4718) }