You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI updates from James Bottomley: "This update includes the usual round of major driver updates (ncr5380, lpfc, hisi_sas, megaraid_sas, ufs, ibmvscsis, mpt3sas). There's also an assortment of minor fixes, mostly in error legs or other not very user visible stuff. The major change is the pci_alloc_irq_vectors replacement for the old pci_msix_.. calls; this effectively makes IRQ mapping generic for the drivers and allows blk_mq to use the information" * tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (256 commits) scsi: qla4xxx: switch to pci_alloc_irq_vectors scsi: hisi_sas: support deferred probe for v2 hw scsi: megaraid_sas: switch to pci_alloc_irq_vectors scsi: scsi_devinfo: remove synchronous ALUA for NETAPP devices scsi: be2iscsi: set errno on error path scsi: be2iscsi: set errno on error path scsi: hpsa: fallback to use legacy REPORT PHYS command scsi: scsi_dh_alua: Fix RCU annotations scsi: hpsa: use %phN for short hex dumps scsi: hisi_sas: fix free'ing in probe and remove scsi: isci: switch to pci_alloc_irq_vectors scsi: ipr: Fix runaway IRQs when falling back from MSI to LSI scsi: dpt_i2o: double free on error path scsi: cxlflash: Migrate scsi command pointer to AFU command scsi: cxlflash: Migrate IOARRIN specific routines to function pointers scsi: cxlflash: Cleanup queuecommand() scsi: cxlflash: Cleanup send_tmf() scsi: cxlflash: Remove AFU command lock scsi: cxlflash: Wait for active AFU commands to timeout upon tear down scsi: cxlflash: Remove private command pool ...
This commit is contained in:
@@ -6,6 +6,7 @@ Main node required properties:
|
||||
- compatible : value should be as follows:
|
||||
(a) "hisilicon,hip05-sas-v1" for v1 hw in hip05 chipset
|
||||
(b) "hisilicon,hip06-sas-v2" for v2 hw in hip06 chipset
|
||||
(c) "hisilicon,hip07-sas-v2" for v2 hw in hip07 chipset
|
||||
- sas-addr : array of 8 bytes for host SAS address
|
||||
- reg : Address and length of the SAS register
|
||||
- hisilicon,sas-syscon: phandle of syscon used for sas control
|
||||
|
||||
@@ -7,8 +7,11 @@ To bind UFS PHY with UFS host controller, the controller node should
|
||||
contain a phandle reference to UFS PHY node.
|
||||
|
||||
Required properties:
|
||||
- compatible : compatible list, contains "qcom,ufs-phy-qmp-20nm"
|
||||
or "qcom,ufs-phy-qmp-14nm" according to the relevant phy in use.
|
||||
- compatible : compatible list, contains one of the following -
|
||||
"qcom,ufs-phy-qmp-20nm" for 20nm ufs phy,
|
||||
"qcom,ufs-phy-qmp-14nm" for legacy 14nm ufs phy,
|
||||
"qcom,msm8996-ufs-phy-qmp-14nm" for 14nm ufs phy
|
||||
present on MSM8996 chipset.
|
||||
- reg : should contain PHY register address space (mandatory),
|
||||
- reg-names : indicates various resources passed to driver (via reg proptery) by name.
|
||||
Required "reg-names" is "phy_mem".
|
||||
|
||||
+15
-17
@@ -3192,15 +3192,15 @@ S: Supported
|
||||
F: drivers/clocksource
|
||||
|
||||
CISCO FCOE HBA DRIVER
|
||||
M: Hiral Patel <hiralpat@cisco.com>
|
||||
M: Suma Ramars <sramars@cisco.com>
|
||||
M: Brian Uchino <buchino@cisco.com>
|
||||
M: Satish Kharat <satishkh@cisco.com>
|
||||
M: Sesidhar Baddela <sebaddel@cisco.com>
|
||||
M: Karan Tilak Kumar <kartilak@cisco.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/scsi/fnic/
|
||||
|
||||
CISCO SCSI HBA DRIVER
|
||||
M: Narsimhulu Musini <nmusini@cisco.com>
|
||||
M: Karan Tilak Kumar <kartilak@cisco.com>
|
||||
M: Sesidhar Baddela <sebaddel@cisco.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
@@ -4787,11 +4787,11 @@ M: David Woodhouse <dwmw2@infradead.org>
|
||||
L: linux-embedded@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
EMULEX/AVAGO LPFC FC/FCOE SCSI DRIVER
|
||||
M: James Smart <james.smart@avagotech.com>
|
||||
M: Dick Kennedy <dick.kennedy@avagotech.com>
|
||||
EMULEX/BROADCOM LPFC FC/FCOE SCSI DRIVER
|
||||
M: James Smart <james.smart@broadcom.com>
|
||||
M: Dick Kennedy <dick.kennedy@broadcom.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
W: http://www.avagotech.com
|
||||
W: http://www.broadcom.com
|
||||
S: Supported
|
||||
F: drivers/scsi/lpfc/
|
||||
|
||||
@@ -5717,7 +5717,6 @@ F: drivers/watchdog/hpwdt.c
|
||||
|
||||
HEWLETT-PACKARD SMART ARRAY RAID DRIVER (hpsa)
|
||||
M: Don Brace <don.brace@microsemi.com>
|
||||
L: iss_storagedev@hp.com
|
||||
L: esc.storagedev@microsemi.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
@@ -5728,7 +5727,6 @@ F: include/uapi/linux/cciss*.h
|
||||
|
||||
HEWLETT-PACKARD SMART CISS RAID DRIVER (cciss)
|
||||
M: Don Brace <don.brace@microsemi.com>
|
||||
L: iss_storagedev@hp.com
|
||||
L: esc.storagedev@microsemi.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
@@ -7968,12 +7966,12 @@ S: Maintained
|
||||
F: drivers/net/wireless/mediatek/mt7601u/
|
||||
|
||||
MEGARAID SCSI/SAS DRIVERS
|
||||
M: Kashyap Desai <kashyap.desai@avagotech.com>
|
||||
M: Sumit Saxena <sumit.saxena@avagotech.com>
|
||||
M: Uday Lingala <uday.lingala@avagotech.com>
|
||||
L: megaraidlinux.pdl@avagotech.com
|
||||
M: Kashyap Desai <kashyap.desai@broadcom.com>
|
||||
M: Sumit Saxena <sumit.saxena@broadcom.com>
|
||||
M: Shivasharan S <shivasharan.srikanteshwara@broadcom.com>
|
||||
L: megaraidlinux.pdl@broadcom.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
W: http://www.lsi.com
|
||||
W: http://www.avagotech.com/support/
|
||||
S: Maintained
|
||||
F: Documentation/scsi/megaraid.txt
|
||||
F: drivers/scsi/megaraid.*
|
||||
@@ -8453,7 +8451,6 @@ F: drivers/scsi/arm/oak.c
|
||||
F: drivers/scsi/atari_scsi.*
|
||||
F: drivers/scsi/dmx3191d.c
|
||||
F: drivers/scsi/g_NCR5380.*
|
||||
F: drivers/scsi/g_NCR5380_mmio.c
|
||||
F: drivers/scsi/mac_scsi.*
|
||||
F: drivers/scsi/sun3_scsi.*
|
||||
F: drivers/scsi/sun3_scsi_vme.c
|
||||
@@ -12547,7 +12544,8 @@ F: Documentation/scsi/ufs.txt
|
||||
F: drivers/scsi/ufs/
|
||||
|
||||
UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER DWC HOOKS
|
||||
M: Joao Pinto <Joao.Pinto@synopsys.com>
|
||||
M: Manjunath M Bettegowda <manjumb@synopsys.com>
|
||||
M: Prabu Thangamuthu <prabut@synopsys.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/scsi/ufs/*dwc*
|
||||
|
||||
@@ -87,6 +87,7 @@ int blk_mq_map_queues(struct blk_mq_tag_set *set)
|
||||
free_cpumask_var(cpus);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(blk_mq_map_queues);
|
||||
|
||||
/*
|
||||
* We have no quick way of doing reverse lookups. This is only used at
|
||||
|
||||
@@ -42,7 +42,6 @@ void blk_mq_disable_hotplug(void);
|
||||
/*
|
||||
* CPU -> queue mappings
|
||||
*/
|
||||
int blk_mq_map_queues(struct blk_mq_tag_set *set);
|
||||
extern int blk_mq_hw_queue_to_node(unsigned int *map, unsigned int);
|
||||
|
||||
static inline struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *q,
|
||||
|
||||
+20
-3
@@ -32,8 +32,13 @@
|
||||
* bsg_destroy_job - routine to teardown/delete a bsg job
|
||||
* @job: bsg_job that is to be torn down
|
||||
*/
|
||||
static void bsg_destroy_job(struct bsg_job *job)
|
||||
static void bsg_destroy_job(struct kref *kref)
|
||||
{
|
||||
struct bsg_job *job = container_of(kref, struct bsg_job, kref);
|
||||
struct request *rq = job->req;
|
||||
|
||||
blk_end_request_all(rq, rq->errors);
|
||||
|
||||
put_device(job->dev); /* release reference for the request */
|
||||
|
||||
kfree(job->request_payload.sg_list);
|
||||
@@ -41,6 +46,18 @@ static void bsg_destroy_job(struct bsg_job *job)
|
||||
kfree(job);
|
||||
}
|
||||
|
||||
void bsg_job_put(struct bsg_job *job)
|
||||
{
|
||||
kref_put(&job->kref, bsg_destroy_job);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bsg_job_put);
|
||||
|
||||
int bsg_job_get(struct bsg_job *job)
|
||||
{
|
||||
return kref_get_unless_zero(&job->kref);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bsg_job_get);
|
||||
|
||||
/**
|
||||
* bsg_job_done - completion routine for bsg requests
|
||||
* @job: bsg_job that is complete
|
||||
@@ -83,8 +100,7 @@ static void bsg_softirq_done(struct request *rq)
|
||||
{
|
||||
struct bsg_job *job = rq->special;
|
||||
|
||||
blk_end_request_all(rq, rq->errors);
|
||||
bsg_destroy_job(job);
|
||||
bsg_job_put(job);
|
||||
}
|
||||
|
||||
static int bsg_map_buffer(struct bsg_buffer *buf, struct request *req)
|
||||
@@ -142,6 +158,7 @@ static int bsg_create_job(struct device *dev, struct request *req)
|
||||
job->dev = dev;
|
||||
/* take a reference for the request */
|
||||
get_device(job->dev);
|
||||
kref_init(&job->kref);
|
||||
return 0;
|
||||
|
||||
failjob_rls_rqst_payload:
|
||||
|
||||
+10
-62
@@ -260,43 +260,6 @@ scsi_cmd_stack_free(ctlr_info_t *h)
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int xmargin=8;
|
||||
static int amargin=60;
|
||||
|
||||
static void
|
||||
print_bytes (unsigned char *c, int len, int hex, int ascii)
|
||||
{
|
||||
|
||||
int i;
|
||||
unsigned char *x;
|
||||
|
||||
if (hex)
|
||||
{
|
||||
x = c;
|
||||
for (i=0;i<len;i++)
|
||||
{
|
||||
if ((i % xmargin) == 0 && i>0) printk("\n");
|
||||
if ((i % xmargin) == 0) printk("0x%04x:", i);
|
||||
printk(" %02x", *x);
|
||||
x++;
|
||||
}
|
||||
printk("\n");
|
||||
}
|
||||
if (ascii)
|
||||
{
|
||||
x = c;
|
||||
for (i=0;i<len;i++)
|
||||
{
|
||||
if ((i % amargin) == 0 && i>0) printk("\n");
|
||||
if ((i % amargin) == 0) printk("0x%04x:", i);
|
||||
if (*x > 26 && *x < 128) printk("%c", *x);
|
||||
else printk(".");
|
||||
x++;
|
||||
}
|
||||
printk("\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_cmd(CommandList_struct *cp)
|
||||
{
|
||||
@@ -305,30 +268,13 @@ print_cmd(CommandList_struct *cp)
|
||||
printk("sgtot:%d\n", cp->Header.SGTotal);
|
||||
printk("Tag:0x%08x/0x%08x\n", cp->Header.Tag.upper,
|
||||
cp->Header.Tag.lower);
|
||||
printk("LUN:0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
|
||||
cp->Header.LUN.LunAddrBytes[0],
|
||||
cp->Header.LUN.LunAddrBytes[1],
|
||||
cp->Header.LUN.LunAddrBytes[2],
|
||||
cp->Header.LUN.LunAddrBytes[3],
|
||||
cp->Header.LUN.LunAddrBytes[4],
|
||||
cp->Header.LUN.LunAddrBytes[5],
|
||||
cp->Header.LUN.LunAddrBytes[6],
|
||||
cp->Header.LUN.LunAddrBytes[7]);
|
||||
printk("LUN:0x%8phN\n", cp->Header.LUN.LunAddrBytes);
|
||||
printk("CDBLen:%d\n", cp->Request.CDBLen);
|
||||
printk("Type:%d\n",cp->Request.Type.Type);
|
||||
printk("Attr:%d\n",cp->Request.Type.Attribute);
|
||||
printk(" Dir:%d\n",cp->Request.Type.Direction);
|
||||
printk("Timeout:%d\n",cp->Request.Timeout);
|
||||
printk( "CDB: %02x %02x %02x %02x %02x %02x %02x %02x"
|
||||
" %02x %02x %02x %02x %02x %02x %02x %02x\n",
|
||||
cp->Request.CDB[0], cp->Request.CDB[1],
|
||||
cp->Request.CDB[2], cp->Request.CDB[3],
|
||||
cp->Request.CDB[4], cp->Request.CDB[5],
|
||||
cp->Request.CDB[6], cp->Request.CDB[7],
|
||||
cp->Request.CDB[8], cp->Request.CDB[9],
|
||||
cp->Request.CDB[10], cp->Request.CDB[11],
|
||||
cp->Request.CDB[12], cp->Request.CDB[13],
|
||||
cp->Request.CDB[14], cp->Request.CDB[15]),
|
||||
printk("CDB: %16ph\n", cp->Request.CDB);
|
||||
printk("edesc.Addr: 0x%08x/0%08x, Len = %d\n",
|
||||
cp->ErrDesc.Addr.upper, cp->ErrDesc.Addr.lower,
|
||||
cp->ErrDesc.Len);
|
||||
@@ -340,9 +286,7 @@ print_cmd(CommandList_struct *cp)
|
||||
printk("offense size:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_size);
|
||||
printk("offense byte:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_num);
|
||||
printk("offense value:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_value);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int
|
||||
@@ -782,8 +726,10 @@ static void complete_scsi_command(CommandList_struct *c, int timeout,
|
||||
"reported\n", c);
|
||||
break;
|
||||
case CMD_INVALID: {
|
||||
/* print_bytes(c, sizeof(*c), 1, 0);
|
||||
print_cmd(c); */
|
||||
/*
|
||||
print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, c, sizeof(*c), false);
|
||||
print_cmd(c);
|
||||
*/
|
||||
/* We get CMD_INVALID if you address a non-existent tape drive instead
|
||||
of a selection timeout (no response). You will see this if you yank
|
||||
out a tape drive, then try to access it. This is kind of a shame
|
||||
@@ -985,8 +931,10 @@ cciss_scsi_interpret_error(ctlr_info_t *h, CommandList_struct *c)
|
||||
dev_warn(&h->pdev->dev,
|
||||
"%p is reported invalid (probably means "
|
||||
"target device no longer present)\n", c);
|
||||
/* print_bytes((unsigned char *) c, sizeof(*c), 1, 0);
|
||||
print_cmd(c); */
|
||||
/*
|
||||
print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, c, sizeof(*c), false);
|
||||
print_cmd(c);
|
||||
*/
|
||||
}
|
||||
break;
|
||||
case CMD_PROTOCOL_ERR:
|
||||
|
||||
@@ -2585,10 +2585,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
||||
(void) GetLanConfigPages(ioc);
|
||||
a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow;
|
||||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"LanAddr = %02X:%02X:%02X"
|
||||
":%02X:%02X:%02X\n",
|
||||
ioc->name, a[5], a[4],
|
||||
a[3], a[2], a[1], a[0]));
|
||||
"LanAddr = %pMR\n", ioc->name, a));
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2868,21 +2865,21 @@ MptDisplayIocCapabilities(MPT_ADAPTER *ioc)
|
||||
|
||||
printk(KERN_INFO "%s: ", ioc->name);
|
||||
if (ioc->prod_name)
|
||||
printk("%s: ", ioc->prod_name);
|
||||
printk("Capabilities={");
|
||||
pr_cont("%s: ", ioc->prod_name);
|
||||
pr_cont("Capabilities={");
|
||||
|
||||
if (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_INITIATOR) {
|
||||
printk("Initiator");
|
||||
pr_cont("Initiator");
|
||||
i++;
|
||||
}
|
||||
|
||||
if (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_TARGET) {
|
||||
printk("%sTarget", i ? "," : "");
|
||||
pr_cont("%sTarget", i ? "," : "");
|
||||
i++;
|
||||
}
|
||||
|
||||
if (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN) {
|
||||
printk("%sLAN", i ? "," : "");
|
||||
pr_cont("%sLAN", i ? "," : "");
|
||||
i++;
|
||||
}
|
||||
|
||||
@@ -2891,12 +2888,12 @@ MptDisplayIocCapabilities(MPT_ADAPTER *ioc)
|
||||
* This would probably evoke more questions than it's worth
|
||||
*/
|
||||
if (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_TARGET) {
|
||||
printk("%sLogBusAddr", i ? "," : "");
|
||||
pr_cont("%sLogBusAddr", i ? "," : "");
|
||||
i++;
|
||||
}
|
||||
#endif
|
||||
|
||||
printk("}\n");
|
||||
pr_cont("}\n");
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
@@ -6783,8 +6780,7 @@ static int mpt_iocinfo_proc_show(struct seq_file *m, void *v)
|
||||
if (ioc->bus_type == FC) {
|
||||
if (ioc->pfacts[p].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN) {
|
||||
u8 *a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow;
|
||||
seq_printf(m, " LanAddr = %02X:%02X:%02X:%02X:%02X:%02X\n",
|
||||
a[5], a[4], a[3], a[2], a[1], a[0]);
|
||||
seq_printf(m, " LanAddr = %pMR\n", a);
|
||||
}
|
||||
seq_printf(m, " WWN = %08X%08X:%08X%08X\n",
|
||||
ioc->fc_port_page0[p].WWNN.High,
|
||||
@@ -6861,8 +6857,7 @@ mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buffer, int *size, int len, int sh
|
||||
|
||||
if (showlan && (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN)) {
|
||||
u8 *a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow;
|
||||
y += sprintf(buffer+len+y, ", LanAddr=%02X:%02X:%02X:%02X:%02X:%02X",
|
||||
a[5], a[4], a[3], a[2], a[1], a[0]);
|
||||
y += sprintf(buffer+len+y, ", LanAddr=%pMR", a);
|
||||
}
|
||||
|
||||
y += sprintf(buffer+len+y, ", IRQ=%d", ioc->pci_irq);
|
||||
@@ -6896,8 +6891,7 @@ static void seq_mpt_print_ioc_summary(MPT_ADAPTER *ioc, struct seq_file *m, int
|
||||
|
||||
if (showlan && (ioc->pfacts[0].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN)) {
|
||||
u8 *a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow;
|
||||
seq_printf(m, ", LanAddr=%02X:%02X:%02X:%02X:%02X:%02X",
|
||||
a[5], a[4], a[3], a[2], a[1], a[0]);
|
||||
seq_printf(m, ", LanAddr=%pMR", a);
|
||||
}
|
||||
|
||||
seq_printf(m, ", IRQ=%d", ioc->pci_irq);
|
||||
|
||||
@@ -1366,15 +1366,10 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt)
|
||||
/* Default to untagged. Once a target structure has been allocated,
|
||||
* use the Inquiry data to determine if device supports tagged.
|
||||
*/
|
||||
if ((vdevice->vtarget->tflags & MPT_TARGET_FLAGS_Q_YES)
|
||||
&& (SCpnt->device->tagged_supported)) {
|
||||
if ((vdevice->vtarget->tflags & MPT_TARGET_FLAGS_Q_YES) &&
|
||||
SCpnt->device->tagged_supported)
|
||||
scsictl = scsidir | MPI_SCSIIO_CONTROL_SIMPLEQ;
|
||||
if (SCpnt->request && SCpnt->request->ioprio) {
|
||||
if (((SCpnt->request->ioprio & 0x7) == 1) ||
|
||||
!(SCpnt->request->ioprio & 0x7))
|
||||
scsictl |= MPI_SCSIIO_CONTROL_HEADOFQ;
|
||||
}
|
||||
} else
|
||||
else
|
||||
scsictl = scsidir | MPI_SCSIIO_CONTROL_UNTAGGED;
|
||||
|
||||
|
||||
|
||||
@@ -141,11 +141,8 @@ struct ufs_qcom_phy_specific_ops {
|
||||
struct ufs_qcom_phy *get_ufs_qcom_phy(struct phy *generic_phy);
|
||||
int ufs_qcom_phy_power_on(struct phy *generic_phy);
|
||||
int ufs_qcom_phy_power_off(struct phy *generic_phy);
|
||||
int ufs_qcom_phy_exit(struct phy *generic_phy);
|
||||
int ufs_qcom_phy_init_clks(struct phy *generic_phy,
|
||||
struct ufs_qcom_phy *phy_common);
|
||||
int ufs_qcom_phy_init_vregulators(struct phy *generic_phy,
|
||||
struct ufs_qcom_phy *phy_common);
|
||||
int ufs_qcom_phy_init_clks(struct ufs_qcom_phy *phy_common);
|
||||
int ufs_qcom_phy_init_vregulators(struct ufs_qcom_phy *phy_common);
|
||||
int ufs_qcom_phy_remove(struct phy *generic_phy,
|
||||
struct ufs_qcom_phy *ufs_qcom_phy);
|
||||
struct phy *ufs_qcom_phy_generic_probe(struct platform_device *pdev,
|
||||
|
||||
@@ -44,30 +44,12 @@ void ufs_qcom_phy_qmp_14nm_advertise_quirks(struct ufs_qcom_phy *phy_common)
|
||||
|
||||
static int ufs_qcom_phy_qmp_14nm_init(struct phy *generic_phy)
|
||||
{
|
||||
struct ufs_qcom_phy_qmp_14nm *phy = phy_get_drvdata(generic_phy);
|
||||
struct ufs_qcom_phy *phy_common = &phy->common_cfg;
|
||||
int err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
err = ufs_qcom_phy_init_clks(generic_phy, phy_common);
|
||||
if (err) {
|
||||
dev_err(phy_common->dev, "%s: ufs_qcom_phy_init_clks() failed %d\n",
|
||||
__func__, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = ufs_qcom_phy_init_vregulators(generic_phy, phy_common);
|
||||
if (err) {
|
||||
dev_err(phy_common->dev, "%s: ufs_qcom_phy_init_vregulators() failed %d\n",
|
||||
__func__, err);
|
||||
goto out;
|
||||
}
|
||||
phy_common->vdda_phy.max_uV = UFS_PHY_VDDA_PHY_UV;
|
||||
phy_common->vdda_phy.min_uV = UFS_PHY_VDDA_PHY_UV;
|
||||
|
||||
ufs_qcom_phy_qmp_14nm_advertise_quirks(phy_common);
|
||||
|
||||
out:
|
||||
return err;
|
||||
static int ufs_qcom_phy_qmp_14nm_exit(struct phy *generic_phy)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
@@ -117,7 +99,7 @@ static int ufs_qcom_phy_qmp_14nm_is_pcs_ready(struct ufs_qcom_phy *phy_common)
|
||||
|
||||
static const struct phy_ops ufs_qcom_phy_qmp_14nm_phy_ops = {
|
||||
.init = ufs_qcom_phy_qmp_14nm_init,
|
||||
.exit = ufs_qcom_phy_exit,
|
||||
.exit = ufs_qcom_phy_qmp_14nm_exit,
|
||||
.power_on = ufs_qcom_phy_power_on,
|
||||
.power_off = ufs_qcom_phy_power_off,
|
||||
.owner = THIS_MODULE,
|
||||
@@ -136,6 +118,7 @@ static int ufs_qcom_phy_qmp_14nm_probe(struct platform_device *pdev)
|
||||
struct device *dev = &pdev->dev;
|
||||
struct phy *generic_phy;
|
||||
struct ufs_qcom_phy_qmp_14nm *phy;
|
||||
struct ufs_qcom_phy *phy_common;
|
||||
int err = 0;
|
||||
|
||||
phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL);
|
||||
@@ -143,8 +126,9 @@ static int ufs_qcom_phy_qmp_14nm_probe(struct platform_device *pdev)
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
phy_common = &phy->common_cfg;
|
||||
|
||||
generic_phy = ufs_qcom_phy_generic_probe(pdev, &phy->common_cfg,
|
||||
generic_phy = ufs_qcom_phy_generic_probe(pdev, phy_common,
|
||||
&ufs_qcom_phy_qmp_14nm_phy_ops, &phy_14nm_ops);
|
||||
|
||||
if (!generic_phy) {
|
||||
@@ -154,39 +138,43 @@ static int ufs_qcom_phy_qmp_14nm_probe(struct platform_device *pdev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = ufs_qcom_phy_init_clks(phy_common);
|
||||
if (err) {
|
||||
dev_err(phy_common->dev,
|
||||
"%s: ufs_qcom_phy_init_clks() failed %d\n",
|
||||
__func__, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = ufs_qcom_phy_init_vregulators(phy_common);
|
||||
if (err) {
|
||||
dev_err(phy_common->dev,
|
||||
"%s: ufs_qcom_phy_init_vregulators() failed %d\n",
|
||||
__func__, err);
|
||||
goto out;
|
||||
}
|
||||
phy_common->vdda_phy.max_uV = UFS_PHY_VDDA_PHY_UV;
|
||||
phy_common->vdda_phy.min_uV = UFS_PHY_VDDA_PHY_UV;
|
||||
|
||||
ufs_qcom_phy_qmp_14nm_advertise_quirks(phy_common);
|
||||
|
||||
phy_set_drvdata(generic_phy, phy);
|
||||
|
||||
strlcpy(phy->common_cfg.name, UFS_PHY_NAME,
|
||||
sizeof(phy->common_cfg.name));
|
||||
strlcpy(phy_common->name, UFS_PHY_NAME, sizeof(phy_common->name));
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ufs_qcom_phy_qmp_14nm_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct phy *generic_phy = to_phy(dev);
|
||||
struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(generic_phy);
|
||||
int err = 0;
|
||||
|
||||
err = ufs_qcom_phy_remove(generic_phy, ufs_qcom_phy);
|
||||
if (err)
|
||||
dev_err(dev, "%s: ufs_qcom_phy_remove failed = %d\n",
|
||||
__func__, err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct of_device_id ufs_qcom_phy_qmp_14nm_of_match[] = {
|
||||
{.compatible = "qcom,ufs-phy-qmp-14nm"},
|
||||
{.compatible = "qcom,msm8996-ufs-phy-qmp-14nm"},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ufs_qcom_phy_qmp_14nm_of_match);
|
||||
|
||||
static struct platform_driver ufs_qcom_phy_qmp_14nm_driver = {
|
||||
.probe = ufs_qcom_phy_qmp_14nm_probe,
|
||||
.remove = ufs_qcom_phy_qmp_14nm_remove,
|
||||
.driver = {
|
||||
.of_match_table = ufs_qcom_phy_qmp_14nm_of_match,
|
||||
.name = "ufs_qcom_phy_qmp_14nm",
|
||||
|
||||
@@ -63,28 +63,12 @@ void ufs_qcom_phy_qmp_20nm_advertise_quirks(struct ufs_qcom_phy *phy_common)
|
||||
|
||||
static int ufs_qcom_phy_qmp_20nm_init(struct phy *generic_phy)
|
||||
{
|
||||
struct ufs_qcom_phy_qmp_20nm *phy = phy_get_drvdata(generic_phy);
|
||||
struct ufs_qcom_phy *phy_common = &phy->common_cfg;
|
||||
int err = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
err = ufs_qcom_phy_init_clks(generic_phy, phy_common);
|
||||
if (err) {
|
||||
dev_err(phy_common->dev, "%s: ufs_qcom_phy_init_clks() failed %d\n",
|
||||
__func__, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = ufs_qcom_phy_init_vregulators(generic_phy, phy_common);
|
||||
if (err) {
|
||||
dev_err(phy_common->dev, "%s: ufs_qcom_phy_init_vregulators() failed %d\n",
|
||||
__func__, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ufs_qcom_phy_qmp_20nm_advertise_quirks(phy_common);
|
||||
|
||||
out:
|
||||
return err;
|
||||
static int ufs_qcom_phy_qmp_20nm_exit(struct phy *generic_phy)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
@@ -173,7 +157,7 @@ static int ufs_qcom_phy_qmp_20nm_is_pcs_ready(struct ufs_qcom_phy *phy_common)
|
||||
|
||||
static const struct phy_ops ufs_qcom_phy_qmp_20nm_phy_ops = {
|
||||
.init = ufs_qcom_phy_qmp_20nm_init,
|
||||
.exit = ufs_qcom_phy_exit,
|
||||
.exit = ufs_qcom_phy_qmp_20nm_exit,
|
||||
.power_on = ufs_qcom_phy_power_on,
|
||||
.power_off = ufs_qcom_phy_power_off,
|
||||
.owner = THIS_MODULE,
|
||||
@@ -192,6 +176,7 @@ static int ufs_qcom_phy_qmp_20nm_probe(struct platform_device *pdev)
|
||||
struct device *dev = &pdev->dev;
|
||||
struct phy *generic_phy;
|
||||
struct ufs_qcom_phy_qmp_20nm *phy;
|
||||
struct ufs_qcom_phy *phy_common;
|
||||
int err = 0;
|
||||
|
||||
phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL);
|
||||
@@ -199,8 +184,9 @@ static int ufs_qcom_phy_qmp_20nm_probe(struct platform_device *pdev)
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
phy_common = &phy->common_cfg;
|
||||
|
||||
generic_phy = ufs_qcom_phy_generic_probe(pdev, &phy->common_cfg,
|
||||
generic_phy = ufs_qcom_phy_generic_probe(pdev, phy_common,
|
||||
&ufs_qcom_phy_qmp_20nm_phy_ops, &phy_20nm_ops);
|
||||
|
||||
if (!generic_phy) {
|
||||
@@ -210,30 +196,30 @@ static int ufs_qcom_phy_qmp_20nm_probe(struct platform_device *pdev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = ufs_qcom_phy_init_clks(phy_common);
|
||||
if (err) {
|
||||
dev_err(phy_common->dev, "%s: ufs_qcom_phy_init_clks() failed %d\n",
|
||||
__func__, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = ufs_qcom_phy_init_vregulators(phy_common);
|
||||
if (err) {
|
||||
dev_err(phy_common->dev, "%s: ufs_qcom_phy_init_vregulators() failed %d\n",
|
||||
__func__, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ufs_qcom_phy_qmp_20nm_advertise_quirks(phy_common);
|
||||
|
||||
phy_set_drvdata(generic_phy, phy);
|
||||
|
||||
strlcpy(phy->common_cfg.name, UFS_PHY_NAME,
|
||||
sizeof(phy->common_cfg.name));
|
||||
strlcpy(phy_common->name, UFS_PHY_NAME, sizeof(phy_common->name));
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ufs_qcom_phy_qmp_20nm_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct phy *generic_phy = to_phy(dev);
|
||||
struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(generic_phy);
|
||||
int err = 0;
|
||||
|
||||
err = ufs_qcom_phy_remove(generic_phy, ufs_qcom_phy);
|
||||
if (err)
|
||||
dev_err(dev, "%s: ufs_qcom_phy_remove failed = %d\n",
|
||||
__func__, err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct of_device_id ufs_qcom_phy_qmp_20nm_of_match[] = {
|
||||
{.compatible = "qcom,ufs-phy-qmp-20nm"},
|
||||
{},
|
||||
@@ -242,7 +228,6 @@ MODULE_DEVICE_TABLE(of, ufs_qcom_phy_qmp_20nm_of_match);
|
||||
|
||||
static struct platform_driver ufs_qcom_phy_qmp_20nm_driver = {
|
||||
.probe = ufs_qcom_phy_qmp_20nm_probe,
|
||||
.remove = ufs_qcom_phy_qmp_20nm_remove,
|
||||
.driver = {
|
||||
.of_match_table = ufs_qcom_phy_qmp_20nm_of_match,
|
||||
.name = "ufs_qcom_phy_qmp_20nm",
|
||||
|
||||
+117
-156
@@ -22,13 +22,6 @@
|
||||
#define VDDP_REF_CLK_MIN_UV 1200000
|
||||
#define VDDP_REF_CLK_MAX_UV 1200000
|
||||
|
||||
static int __ufs_qcom_phy_init_vreg(struct phy *, struct ufs_qcom_phy_vreg *,
|
||||
const char *, bool);
|
||||
static int ufs_qcom_phy_init_vreg(struct phy *, struct ufs_qcom_phy_vreg *,
|
||||
const char *);
|
||||
static int ufs_qcom_phy_base_init(struct platform_device *pdev,
|
||||
struct ufs_qcom_phy *phy_common);
|
||||
|
||||
int ufs_qcom_phy_calibrate(struct ufs_qcom_phy *ufs_qcom_phy,
|
||||
struct ufs_qcom_phy_calibration *tbl_A,
|
||||
int tbl_size_A,
|
||||
@@ -75,45 +68,6 @@ out:
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_calibrate);
|
||||
|
||||
struct phy *ufs_qcom_phy_generic_probe(struct platform_device *pdev,
|
||||
struct ufs_qcom_phy *common_cfg,
|
||||
const struct phy_ops *ufs_qcom_phy_gen_ops,
|
||||
struct ufs_qcom_phy_specific_ops *phy_spec_ops)
|
||||
{
|
||||
int err;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct phy *generic_phy = NULL;
|
||||
struct phy_provider *phy_provider;
|
||||
|
||||
err = ufs_qcom_phy_base_init(pdev, common_cfg);
|
||||
if (err) {
|
||||
dev_err(dev, "%s: phy base init failed %d\n", __func__, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
|
||||
if (IS_ERR(phy_provider)) {
|
||||
err = PTR_ERR(phy_provider);
|
||||
dev_err(dev, "%s: failed to register phy %d\n", __func__, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
generic_phy = devm_phy_create(dev, NULL, ufs_qcom_phy_gen_ops);
|
||||
if (IS_ERR(generic_phy)) {
|
||||
err = PTR_ERR(generic_phy);
|
||||
dev_err(dev, "%s: failed to create phy %d\n", __func__, err);
|
||||
generic_phy = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
common_cfg->phy_spec_ops = phy_spec_ops;
|
||||
common_cfg->dev = dev;
|
||||
|
||||
out:
|
||||
return generic_phy;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_generic_probe);
|
||||
|
||||
/*
|
||||
* This assumes the embedded phy structure inside generic_phy is of type
|
||||
* struct ufs_qcom_phy. In order to function properly it's crucial
|
||||
@@ -154,13 +108,50 @@ int ufs_qcom_phy_base_init(struct platform_device *pdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __ufs_qcom_phy_clk_get(struct phy *phy,
|
||||
struct phy *ufs_qcom_phy_generic_probe(struct platform_device *pdev,
|
||||
struct ufs_qcom_phy *common_cfg,
|
||||
const struct phy_ops *ufs_qcom_phy_gen_ops,
|
||||
struct ufs_qcom_phy_specific_ops *phy_spec_ops)
|
||||
{
|
||||
int err;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct phy *generic_phy = NULL;
|
||||
struct phy_provider *phy_provider;
|
||||
|
||||
err = ufs_qcom_phy_base_init(pdev, common_cfg);
|
||||
if (err) {
|
||||
dev_err(dev, "%s: phy base init failed %d\n", __func__, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
|
||||
if (IS_ERR(phy_provider)) {
|
||||
err = PTR_ERR(phy_provider);
|
||||
dev_err(dev, "%s: failed to register phy %d\n", __func__, err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
generic_phy = devm_phy_create(dev, NULL, ufs_qcom_phy_gen_ops);
|
||||
if (IS_ERR(generic_phy)) {
|
||||
err = PTR_ERR(generic_phy);
|
||||
dev_err(dev, "%s: failed to create phy %d\n", __func__, err);
|
||||
generic_phy = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
common_cfg->phy_spec_ops = phy_spec_ops;
|
||||
common_cfg->dev = dev;
|
||||
|
||||
out:
|
||||
return generic_phy;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_generic_probe);
|
||||
|
||||
static int __ufs_qcom_phy_clk_get(struct device *dev,
|
||||
const char *name, struct clk **clk_out, bool err_print)
|
||||
{
|
||||
struct clk *clk;
|
||||
int err = 0;
|
||||
struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(phy);
|
||||
struct device *dev = ufs_qcom_phy->dev;
|
||||
|
||||
clk = devm_clk_get(dev, name);
|
||||
if (IS_ERR(clk)) {
|
||||
@@ -174,42 +165,44 @@ static int __ufs_qcom_phy_clk_get(struct phy *phy,
|
||||
return err;
|
||||
}
|
||||
|
||||
static
|
||||
int ufs_qcom_phy_clk_get(struct phy *phy,
|
||||
static int ufs_qcom_phy_clk_get(struct device *dev,
|
||||
const char *name, struct clk **clk_out)
|
||||
{
|
||||
return __ufs_qcom_phy_clk_get(phy, name, clk_out, true);
|
||||
return __ufs_qcom_phy_clk_get(dev, name, clk_out, true);
|
||||
}
|
||||
|
||||
int
|
||||
ufs_qcom_phy_init_clks(struct phy *generic_phy,
|
||||
struct ufs_qcom_phy *phy_common)
|
||||
int ufs_qcom_phy_init_clks(struct ufs_qcom_phy *phy_common)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = ufs_qcom_phy_clk_get(generic_phy, "tx_iface_clk",
|
||||
if (of_device_is_compatible(phy_common->dev->of_node,
|
||||
"qcom,msm8996-ufs-phy-qmp-14nm"))
|
||||
goto skip_txrx_clk;
|
||||
|
||||
err = ufs_qcom_phy_clk_get(phy_common->dev, "tx_iface_clk",
|
||||
&phy_common->tx_iface_clk);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = ufs_qcom_phy_clk_get(generic_phy, "rx_iface_clk",
|
||||
err = ufs_qcom_phy_clk_get(phy_common->dev, "rx_iface_clk",
|
||||
&phy_common->rx_iface_clk);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = ufs_qcom_phy_clk_get(generic_phy, "ref_clk_src",
|
||||
err = ufs_qcom_phy_clk_get(phy_common->dev, "ref_clk_src",
|
||||
&phy_common->ref_clk_src);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
skip_txrx_clk:
|
||||
/*
|
||||
* "ref_clk_parent" is optional hence don't abort init if it's not
|
||||
* found.
|
||||
*/
|
||||
__ufs_qcom_phy_clk_get(generic_phy, "ref_clk_parent",
|
||||
__ufs_qcom_phy_clk_get(phy_common->dev, "ref_clk_parent",
|
||||
&phy_common->ref_clk_parent, false);
|
||||
|
||||
err = ufs_qcom_phy_clk_get(generic_phy, "ref_clk",
|
||||
err = ufs_qcom_phy_clk_get(phy_common->dev, "ref_clk",
|
||||
&phy_common->ref_clk);
|
||||
|
||||
out:
|
||||
@@ -217,41 +210,14 @@ out:
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_init_clks);
|
||||
|
||||
int
|
||||
ufs_qcom_phy_init_vregulators(struct phy *generic_phy,
|
||||
struct ufs_qcom_phy *phy_common)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = ufs_qcom_phy_init_vreg(generic_phy, &phy_common->vdda_pll,
|
||||
"vdda-pll");
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = ufs_qcom_phy_init_vreg(generic_phy, &phy_common->vdda_phy,
|
||||
"vdda-phy");
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
/* vddp-ref-clk-* properties are optional */
|
||||
__ufs_qcom_phy_init_vreg(generic_phy, &phy_common->vddp_ref_clk,
|
||||
"vddp-ref-clk", true);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_init_vregulators);
|
||||
|
||||
static int __ufs_qcom_phy_init_vreg(struct phy *phy,
|
||||
static int __ufs_qcom_phy_init_vreg(struct device *dev,
|
||||
struct ufs_qcom_phy_vreg *vreg, const char *name, bool optional)
|
||||
{
|
||||
int err = 0;
|
||||
struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(phy);
|
||||
struct device *dev = ufs_qcom_phy->dev;
|
||||
|
||||
char prop_name[MAX_PROP_NAME];
|
||||
|
||||
vreg->name = kstrdup(name, GFP_KERNEL);
|
||||
vreg->name = devm_kstrdup(dev, name, GFP_KERNEL);
|
||||
if (!vreg->name) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
@@ -304,14 +270,36 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ufs_qcom_phy_init_vreg(struct phy *phy,
|
||||
static int ufs_qcom_phy_init_vreg(struct device *dev,
|
||||
struct ufs_qcom_phy_vreg *vreg, const char *name)
|
||||
{
|
||||
return __ufs_qcom_phy_init_vreg(phy, vreg, name, false);
|
||||
return __ufs_qcom_phy_init_vreg(dev, vreg, name, false);
|
||||
}
|
||||
|
||||
static
|
||||
int ufs_qcom_phy_cfg_vreg(struct phy *phy,
|
||||
int ufs_qcom_phy_init_vregulators(struct ufs_qcom_phy *phy_common)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = ufs_qcom_phy_init_vreg(phy_common->dev, &phy_common->vdda_pll,
|
||||
"vdda-pll");
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = ufs_qcom_phy_init_vreg(phy_common->dev, &phy_common->vdda_phy,
|
||||
"vdda-phy");
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
/* vddp-ref-clk-* properties are optional */
|
||||
__ufs_qcom_phy_init_vreg(phy_common->dev, &phy_common->vddp_ref_clk,
|
||||
"vddp-ref-clk", true);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_init_vregulators);
|
||||
|
||||
static int ufs_qcom_phy_cfg_vreg(struct device *dev,
|
||||
struct ufs_qcom_phy_vreg *vreg, bool on)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -319,10 +307,6 @@ int ufs_qcom_phy_cfg_vreg(struct phy *phy,
|
||||
const char *name = vreg->name;
|
||||
int min_uV;
|
||||
int uA_load;
|
||||
struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(phy);
|
||||
struct device *dev = ufs_qcom_phy->dev;
|
||||
|
||||
BUG_ON(!vreg);
|
||||
|
||||
if (regulator_count_voltages(reg) > 0) {
|
||||
min_uV = on ? vreg->min_uV : 0;
|
||||
@@ -350,18 +334,15 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static
|
||||
int ufs_qcom_phy_enable_vreg(struct phy *phy,
|
||||
static int ufs_qcom_phy_enable_vreg(struct device *dev,
|
||||
struct ufs_qcom_phy_vreg *vreg)
|
||||
{
|
||||
struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(phy);
|
||||
struct device *dev = ufs_qcom_phy->dev;
|
||||
int ret = 0;
|
||||
|
||||
if (!vreg || vreg->enabled)
|
||||
goto out;
|
||||
|
||||
ret = ufs_qcom_phy_cfg_vreg(phy, vreg, true);
|
||||
ret = ufs_qcom_phy_cfg_vreg(dev, vreg, true);
|
||||
if (ret) {
|
||||
dev_err(dev, "%s: ufs_qcom_phy_cfg_vreg() failed, err=%d\n",
|
||||
__func__, ret);
|
||||
@@ -380,10 +361,9 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ufs_qcom_phy_enable_ref_clk(struct phy *generic_phy)
|
||||
static int ufs_qcom_phy_enable_ref_clk(struct ufs_qcom_phy *phy)
|
||||
{
|
||||
int ret = 0;
|
||||
struct ufs_qcom_phy *phy = get_ufs_qcom_phy(generic_phy);
|
||||
|
||||
if (phy->is_ref_clk_enabled)
|
||||
goto out;
|
||||
@@ -430,14 +410,10 @@ out_disable_src:
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_enable_ref_clk);
|
||||
|
||||
static
|
||||
int ufs_qcom_phy_disable_vreg(struct phy *phy,
|
||||
static int ufs_qcom_phy_disable_vreg(struct device *dev,
|
||||
struct ufs_qcom_phy_vreg *vreg)
|
||||
{
|
||||
struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(phy);
|
||||
struct device *dev = ufs_qcom_phy->dev;
|
||||
int ret = 0;
|
||||
|
||||
if (!vreg || !vreg->enabled || vreg->is_always_on)
|
||||
@@ -447,7 +423,7 @@ int ufs_qcom_phy_disable_vreg(struct phy *phy,
|
||||
|
||||
if (!ret) {
|
||||
/* ignore errors on applying disable config */
|
||||
ufs_qcom_phy_cfg_vreg(phy, vreg, false);
|
||||
ufs_qcom_phy_cfg_vreg(dev, vreg, false);
|
||||
vreg->enabled = false;
|
||||
} else {
|
||||
dev_err(dev, "%s: %s disable failed, err=%d\n",
|
||||
@@ -457,10 +433,8 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ufs_qcom_phy_disable_ref_clk(struct phy *generic_phy)
|
||||
static void ufs_qcom_phy_disable_ref_clk(struct ufs_qcom_phy *phy)
|
||||
{
|
||||
struct ufs_qcom_phy *phy = get_ufs_qcom_phy(generic_phy);
|
||||
|
||||
if (phy->is_ref_clk_enabled) {
|
||||
clk_disable_unprepare(phy->ref_clk);
|
||||
/*
|
||||
@@ -473,7 +447,6 @@ void ufs_qcom_phy_disable_ref_clk(struct phy *generic_phy)
|
||||
phy->is_ref_clk_enabled = false;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_disable_ref_clk);
|
||||
|
||||
#define UFS_REF_CLK_EN (1 << 5)
|
||||
|
||||
@@ -526,9 +499,8 @@ void ufs_qcom_phy_disable_dev_ref_clk(struct phy *generic_phy)
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_disable_dev_ref_clk);
|
||||
|
||||
/* Turn ON M-PHY RMMI interface clocks */
|
||||
int ufs_qcom_phy_enable_iface_clk(struct phy *generic_phy)
|
||||
static int ufs_qcom_phy_enable_iface_clk(struct ufs_qcom_phy *phy)
|
||||
{
|
||||
struct ufs_qcom_phy *phy = get_ufs_qcom_phy(generic_phy);
|
||||
int ret = 0;
|
||||
|
||||
if (phy->is_iface_clk_enabled)
|
||||
@@ -552,20 +524,16 @@ int ufs_qcom_phy_enable_iface_clk(struct phy *generic_phy)
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_enable_iface_clk);
|
||||
|
||||
/* Turn OFF M-PHY RMMI interface clocks */
|
||||
void ufs_qcom_phy_disable_iface_clk(struct phy *generic_phy)
|
||||
void ufs_qcom_phy_disable_iface_clk(struct ufs_qcom_phy *phy)
|
||||
{
|
||||
struct ufs_qcom_phy *phy = get_ufs_qcom_phy(generic_phy);
|
||||
|
||||
if (phy->is_iface_clk_enabled) {
|
||||
clk_disable_unprepare(phy->tx_iface_clk);
|
||||
clk_disable_unprepare(phy->rx_iface_clk);
|
||||
phy->is_iface_clk_enabled = false;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_disable_iface_clk);
|
||||
|
||||
int ufs_qcom_phy_start_serdes(struct phy *generic_phy)
|
||||
{
|
||||
@@ -634,29 +602,6 @@ int ufs_qcom_phy_calibrate_phy(struct phy *generic_phy, bool is_rate_B)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_calibrate_phy);
|
||||
|
||||
int ufs_qcom_phy_remove(struct phy *generic_phy,
|
||||
struct ufs_qcom_phy *ufs_qcom_phy)
|
||||
{
|
||||
phy_power_off(generic_phy);
|
||||
|
||||
kfree(ufs_qcom_phy->vdda_pll.name);
|
||||
kfree(ufs_qcom_phy->vdda_phy.name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_remove);
|
||||
|
||||
int ufs_qcom_phy_exit(struct phy *generic_phy)
|
||||
{
|
||||
struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(generic_phy);
|
||||
|
||||
if (ufs_qcom_phy->is_powered_on)
|
||||
phy_power_off(generic_phy);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufs_qcom_phy_exit);
|
||||
|
||||
int ufs_qcom_phy_is_pcs_ready(struct phy *generic_phy)
|
||||
{
|
||||
struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(generic_phy);
|
||||
@@ -678,7 +623,10 @@ int ufs_qcom_phy_power_on(struct phy *generic_phy)
|
||||
struct device *dev = phy_common->dev;
|
||||
int err;
|
||||
|
||||
err = ufs_qcom_phy_enable_vreg(generic_phy, &phy_common->vdda_phy);
|
||||
if (phy_common->is_powered_on)
|
||||
return 0;
|
||||
|
||||
err = ufs_qcom_phy_enable_vreg(dev, &phy_common->vdda_phy);
|
||||
if (err) {
|
||||
dev_err(dev, "%s enable vdda_phy failed, err=%d\n",
|
||||
__func__, err);
|
||||
@@ -688,23 +636,30 @@ int ufs_qcom_phy_power_on(struct phy *generic_phy)
|
||||
phy_common->phy_spec_ops->power_control(phy_common, true);
|
||||
|
||||
/* vdda_pll also enables ref clock LDOs so enable it first */
|
||||
err = ufs_qcom_phy_enable_vreg(generic_phy, &phy_common->vdda_pll);
|
||||
err = ufs_qcom_phy_enable_vreg(dev, &phy_common->vdda_pll);
|
||||
if (err) {
|
||||
dev_err(dev, "%s enable vdda_pll failed, err=%d\n",
|
||||
__func__, err);
|
||||
goto out_disable_phy;
|
||||
}
|
||||
|
||||
err = ufs_qcom_phy_enable_ref_clk(generic_phy);
|
||||
err = ufs_qcom_phy_enable_iface_clk(phy_common);
|
||||
if (err) {
|
||||
dev_err(dev, "%s enable phy ref clock failed, err=%d\n",
|
||||
dev_err(dev, "%s enable phy iface clock failed, err=%d\n",
|
||||
__func__, err);
|
||||
goto out_disable_pll;
|
||||
}
|
||||
|
||||
err = ufs_qcom_phy_enable_ref_clk(phy_common);
|
||||
if (err) {
|
||||
dev_err(dev, "%s enable phy ref clock failed, err=%d\n",
|
||||
__func__, err);
|
||||
goto out_disable_iface_clk;
|
||||
}
|
||||
|
||||
/* enable device PHY ref_clk pad rail */
|
||||
if (phy_common->vddp_ref_clk.reg) {
|
||||
err = ufs_qcom_phy_enable_vreg(generic_phy,
|
||||
err = ufs_qcom_phy_enable_vreg(dev,
|
||||
&phy_common->vddp_ref_clk);
|
||||
if (err) {
|
||||
dev_err(dev, "%s enable vddp_ref_clk failed, err=%d\n",
|
||||
@@ -717,11 +672,13 @@ int ufs_qcom_phy_power_on(struct phy *generic_phy)
|
||||
goto out;
|
||||
|
||||
out_disable_ref_clk:
|
||||
ufs_qcom_phy_disable_ref_clk(generic_phy);
|
||||
ufs_qcom_phy_disable_ref_clk(phy_common);
|
||||
out_disable_iface_clk:
|
||||
ufs_qcom_phy_disable_iface_clk(phy_common);
|
||||
out_disable_pll:
|
||||
ufs_qcom_phy_disable_vreg(generic_phy, &phy_common->vdda_pll);
|
||||
ufs_qcom_phy_disable_vreg(dev, &phy_common->vdda_pll);
|
||||
out_disable_phy:
|
||||
ufs_qcom_phy_disable_vreg(generic_phy, &phy_common->vdda_phy);
|
||||
ufs_qcom_phy_disable_vreg(dev, &phy_common->vdda_phy);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
@@ -731,15 +688,19 @@ int ufs_qcom_phy_power_off(struct phy *generic_phy)
|
||||
{
|
||||
struct ufs_qcom_phy *phy_common = get_ufs_qcom_phy(generic_phy);
|
||||
|
||||
if (!phy_common->is_powered_on)
|
||||
return 0;
|
||||
|
||||
phy_common->phy_spec_ops->power_control(phy_common, false);
|
||||
|
||||
if (phy_common->vddp_ref_clk.reg)
|
||||
ufs_qcom_phy_disable_vreg(generic_phy,
|
||||
ufs_qcom_phy_disable_vreg(phy_common->dev,
|
||||
&phy_common->vddp_ref_clk);
|
||||
ufs_qcom_phy_disable_ref_clk(generic_phy);
|
||||
ufs_qcom_phy_disable_ref_clk(phy_common);
|
||||
ufs_qcom_phy_disable_iface_clk(phy_common);
|
||||
|
||||
ufs_qcom_phy_disable_vreg(generic_phy, &phy_common->vdda_pll);
|
||||
ufs_qcom_phy_disable_vreg(generic_phy, &phy_common->vdda_phy);
|
||||
ufs_qcom_phy_disable_vreg(phy_common->dev, &phy_common->vdda_pll);
|
||||
ufs_qcom_phy_disable_vreg(phy_common->dev, &phy_common->vdda_phy);
|
||||
phy_common->is_powered_on = false;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -84,8 +84,8 @@ extern void zfcp_fc_link_test_work(struct work_struct *);
|
||||
extern void zfcp_fc_wka_ports_force_offline(struct zfcp_fc_wka_ports *);
|
||||
extern int zfcp_fc_gs_setup(struct zfcp_adapter *);
|
||||
extern void zfcp_fc_gs_destroy(struct zfcp_adapter *);
|
||||
extern int zfcp_fc_exec_bsg_job(struct fc_bsg_job *);
|
||||
extern int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *);
|
||||
extern int zfcp_fc_exec_bsg_job(struct bsg_job *);
|
||||
extern int zfcp_fc_timeout_bsg_job(struct bsg_job *);
|
||||
extern void zfcp_fc_sym_name_update(struct work_struct *);
|
||||
extern unsigned int zfcp_fc_port_scan_backoff(void);
|
||||
extern void zfcp_fc_conditional_port_scan(struct zfcp_adapter *);
|
||||
|
||||
+22
-14
@@ -13,6 +13,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/bsg-lib.h>
|
||||
#include <scsi/fc/fc_els.h>
|
||||
#include <scsi/libfc.h>
|
||||
#include "zfcp_ext.h"
|
||||
@@ -885,26 +886,30 @@ out_free:
|
||||
|
||||
static void zfcp_fc_ct_els_job_handler(void *data)
|
||||
{
|
||||
struct fc_bsg_job *job = data;
|
||||
struct bsg_job *job = data;
|
||||
struct zfcp_fsf_ct_els *zfcp_ct_els = job->dd_data;
|
||||
struct fc_bsg_reply *jr = job->reply;
|
||||
|
||||
jr->reply_payload_rcv_len = job->reply_payload.payload_len;
|
||||
jr->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
|
||||
jr->result = zfcp_ct_els->status ? -EIO : 0;
|
||||
job->job_done(job);
|
||||
bsg_job_done(job, jr->result, jr->reply_payload_rcv_len);
|
||||
}
|
||||
|
||||
static struct zfcp_fc_wka_port *zfcp_fc_job_wka_port(struct fc_bsg_job *job)
|
||||
static struct zfcp_fc_wka_port *zfcp_fc_job_wka_port(struct bsg_job *job)
|
||||
{
|
||||
u32 preamble_word1;
|
||||
u8 gs_type;
|
||||
struct zfcp_adapter *adapter;
|
||||
struct fc_bsg_request *bsg_request = job->request;
|
||||
struct fc_rport *rport = fc_bsg_to_rport(job);
|
||||
struct Scsi_Host *shost;
|
||||
|
||||
preamble_word1 = job->request->rqst_data.r_ct.preamble_word1;
|
||||
preamble_word1 = bsg_request->rqst_data.r_ct.preamble_word1;
|
||||
gs_type = (preamble_word1 & 0xff000000) >> 24;
|
||||
|
||||
adapter = (struct zfcp_adapter *) job->shost->hostdata[0];
|
||||
shost = rport ? rport_to_shost(rport) : fc_bsg_to_shost(job);
|
||||
adapter = (struct zfcp_adapter *) shost->hostdata[0];
|
||||
|
||||
switch (gs_type) {
|
||||
case FC_FST_ALIAS:
|
||||
@@ -924,7 +929,7 @@ static struct zfcp_fc_wka_port *zfcp_fc_job_wka_port(struct fc_bsg_job *job)
|
||||
|
||||
static void zfcp_fc_ct_job_handler(void *data)
|
||||
{
|
||||
struct fc_bsg_job *job = data;
|
||||
struct bsg_job *job = data;
|
||||
struct zfcp_fc_wka_port *wka_port;
|
||||
|
||||
wka_port = zfcp_fc_job_wka_port(job);
|
||||
@@ -933,11 +938,12 @@ static void zfcp_fc_ct_job_handler(void *data)
|
||||
zfcp_fc_ct_els_job_handler(data);
|
||||
}
|
||||
|
||||
static int zfcp_fc_exec_els_job(struct fc_bsg_job *job,
|
||||
static int zfcp_fc_exec_els_job(struct bsg_job *job,
|
||||
struct zfcp_adapter *adapter)
|
||||
{
|
||||
struct zfcp_fsf_ct_els *els = job->dd_data;
|
||||
struct fc_rport *rport = job->rport;
|
||||
struct fc_rport *rport = fc_bsg_to_rport(job);
|
||||
struct fc_bsg_request *bsg_request = job->request;
|
||||
struct zfcp_port *port;
|
||||
u32 d_id;
|
||||
|
||||
@@ -949,13 +955,13 @@ static int zfcp_fc_exec_els_job(struct fc_bsg_job *job,
|
||||
d_id = port->d_id;
|
||||
put_device(&port->dev);
|
||||
} else
|
||||
d_id = ntoh24(job->request->rqst_data.h_els.port_id);
|
||||
d_id = ntoh24(bsg_request->rqst_data.h_els.port_id);
|
||||
|
||||
els->handler = zfcp_fc_ct_els_job_handler;
|
||||
return zfcp_fsf_send_els(adapter, d_id, els, job->req->timeout / HZ);
|
||||
}
|
||||
|
||||
static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job,
|
||||
static int zfcp_fc_exec_ct_job(struct bsg_job *job,
|
||||
struct zfcp_adapter *adapter)
|
||||
{
|
||||
int ret;
|
||||
@@ -978,13 +984,15 @@ static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job)
|
||||
int zfcp_fc_exec_bsg_job(struct bsg_job *job)
|
||||
{
|
||||
struct Scsi_Host *shost;
|
||||
struct zfcp_adapter *adapter;
|
||||
struct zfcp_fsf_ct_els *ct_els = job->dd_data;
|
||||
struct fc_bsg_request *bsg_request = job->request;
|
||||
struct fc_rport *rport = fc_bsg_to_rport(job);
|
||||
|
||||
shost = job->rport ? rport_to_shost(job->rport) : job->shost;
|
||||
shost = rport ? rport_to_shost(rport) : fc_bsg_to_shost(job);
|
||||
adapter = (struct zfcp_adapter *)shost->hostdata[0];
|
||||
|
||||
if (!(atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_OPEN))
|
||||
@@ -994,7 +1002,7 @@ int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job)
|
||||
ct_els->resp = job->reply_payload.sg_list;
|
||||
ct_els->handler_data = job;
|
||||
|
||||
switch (job->request->msgcode) {
|
||||
switch (bsg_request->msgcode) {
|
||||
case FC_BSG_RPT_ELS:
|
||||
case FC_BSG_HST_ELS_NOLOGIN:
|
||||
return zfcp_fc_exec_els_job(job, adapter);
|
||||
@@ -1006,7 +1014,7 @@ int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job)
|
||||
}
|
||||
}
|
||||
|
||||
int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *job)
|
||||
int zfcp_fc_timeout_bsg_job(struct bsg_job *job)
|
||||
{
|
||||
/* hardware tracks timeout, reset bsg timeout to not interfere */
|
||||
return -EAGAIN;
|
||||
|
||||
+7
-28
@@ -263,6 +263,7 @@ config SCSI_SPI_ATTRS
|
||||
config SCSI_FC_ATTRS
|
||||
tristate "FiberChannel Transport Attributes"
|
||||
depends on SCSI && NET
|
||||
select BLK_DEV_BSGLIB
|
||||
select SCSI_NETLINK
|
||||
help
|
||||
If you wish to export transport-specific information about
|
||||
@@ -743,40 +744,18 @@ config SCSI_ISCI
|
||||
control unit found in the Intel(R) C600 series chipset.
|
||||
|
||||
config SCSI_GENERIC_NCR5380
|
||||
tristate "Generic NCR5380/53c400 SCSI PIO support"
|
||||
depends on ISA && SCSI
|
||||
tristate "Generic NCR5380/53c400 SCSI ISA card support"
|
||||
depends on ISA && SCSI && HAS_IOPORT_MAP
|
||||
select SCSI_SPI_ATTRS
|
||||
---help---
|
||||
This is a driver for the old NCR 53c80 series of SCSI controllers
|
||||
on boards using PIO. Most boards such as the Trantor T130 fit this
|
||||
category, along with a large number of ISA 8bit controllers shipped
|
||||
for free with SCSI scanners. If you have a PAS16, T128 or DMX3191
|
||||
you should select the specific driver for that card rather than
|
||||
generic 5380 support.
|
||||
|
||||
It is explained in section 3.8 of the SCSI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>. If it doesn't work out
|
||||
of the box, you may have to change some settings in
|
||||
<file:drivers/scsi/g_NCR5380.h>.
|
||||
This is a driver for old ISA card SCSI controllers based on a
|
||||
NCR 5380, 53C80, 53C400, 53C400A, or DTC 436 device.
|
||||
Most boards such as the Trantor T130 fit this category, as do
|
||||
various 8-bit and 16-bit ISA cards bundled with SCSI scanners.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called g_NCR5380.
|
||||
|
||||
config SCSI_GENERIC_NCR5380_MMIO
|
||||
tristate "Generic NCR5380/53c400 SCSI MMIO support"
|
||||
depends on ISA && SCSI
|
||||
select SCSI_SPI_ATTRS
|
||||
---help---
|
||||
This is a driver for the old NCR 53c80 series of SCSI controllers
|
||||
on boards using memory mapped I/O.
|
||||
It is explained in section 3.8 of the SCSI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>. If it doesn't work out
|
||||
of the box, you may have to change some settings in
|
||||
<file:drivers/scsi/g_NCR5380.h>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called g_NCR5380_mmio.
|
||||
|
||||
config SCSI_IPS
|
||||
tristate "IBM ServeRAID support"
|
||||
depends on PCI && SCSI
|
||||
|
||||
@@ -74,7 +74,6 @@ obj-$(CONFIG_SCSI_ISCI) += isci/
|
||||
obj-$(CONFIG_SCSI_IPS) += ips.o
|
||||
obj-$(CONFIG_SCSI_FUTURE_DOMAIN)+= fdomain.o
|
||||
obj-$(CONFIG_SCSI_GENERIC_NCR5380) += g_NCR5380.o
|
||||
obj-$(CONFIG_SCSI_GENERIC_NCR5380_MMIO) += g_NCR5380_mmio.o
|
||||
obj-$(CONFIG_SCSI_NCR53C406A) += NCR53c406a.o
|
||||
obj-$(CONFIG_SCSI_NCR_D700) += 53c700.o NCR_D700.o
|
||||
obj-$(CONFIG_SCSI_NCR_Q720) += NCR_Q720_mod.o
|
||||
|
||||
+74
-63
@@ -121,9 +121,10 @@
|
||||
*
|
||||
* Either real DMA *or* pseudo DMA may be implemented
|
||||
*
|
||||
* NCR5380_dma_write_setup(instance, src, count) - initialize
|
||||
* NCR5380_dma_read_setup(instance, dst, count) - initialize
|
||||
* NCR5380_dma_residual(instance); - residual count
|
||||
* NCR5380_dma_xfer_len - determine size of DMA/PDMA transfer
|
||||
* NCR5380_dma_send_setup - execute DMA/PDMA from memory to 5380
|
||||
* NCR5380_dma_recv_setup - execute DMA/PDMA from 5380 to memory
|
||||
* NCR5380_dma_residual - residual byte count
|
||||
*
|
||||
* The generic driver is initialized by calling NCR5380_init(instance),
|
||||
* after setting the appropriate host specific fields and ID. If the
|
||||
@@ -178,7 +179,7 @@ static inline void initialize_SCp(struct scsi_cmnd *cmd)
|
||||
|
||||
/**
|
||||
* NCR5380_poll_politely2 - wait for two chip register values
|
||||
* @instance: controller to poll
|
||||
* @hostdata: host private data
|
||||
* @reg1: 5380 register to poll
|
||||
* @bit1: Bitmask to check
|
||||
* @val1: Expected value
|
||||
@@ -195,18 +196,14 @@ static inline void initialize_SCp(struct scsi_cmnd *cmd)
|
||||
* Returns 0 if either or both event(s) occurred otherwise -ETIMEDOUT.
|
||||
*/
|
||||
|
||||
static int NCR5380_poll_politely2(struct Scsi_Host *instance,
|
||||
int reg1, int bit1, int val1,
|
||||
int reg2, int bit2, int val2, int wait)
|
||||
static int NCR5380_poll_politely2(struct NCR5380_hostdata *hostdata,
|
||||
unsigned int reg1, u8 bit1, u8 val1,
|
||||
unsigned int reg2, u8 bit2, u8 val2,
|
||||
unsigned long wait)
|
||||
{
|
||||
struct NCR5380_hostdata *hostdata = shost_priv(instance);
|
||||
unsigned long n = hostdata->poll_loops;
|
||||
unsigned long deadline = jiffies + wait;
|
||||
unsigned long n;
|
||||
|
||||
/* Busy-wait for up to 10 ms */
|
||||
n = min(10000U, jiffies_to_usecs(wait));
|
||||
n *= hostdata->accesses_per_ms;
|
||||
n /= 2000;
|
||||
do {
|
||||
if ((NCR5380_read(reg1) & bit1) == val1)
|
||||
return 0;
|
||||
@@ -288,6 +285,7 @@ mrs[] = {
|
||||
|
||||
static void NCR5380_print(struct Scsi_Host *instance)
|
||||
{
|
||||
struct NCR5380_hostdata *hostdata = shost_priv(instance);
|
||||
unsigned char status, data, basr, mr, icr, i;
|
||||
|
||||
data = NCR5380_read(CURRENT_SCSI_DATA_REG);
|
||||
@@ -337,6 +335,7 @@ static struct {
|
||||
|
||||
static void NCR5380_print_phase(struct Scsi_Host *instance)
|
||||
{
|
||||
struct NCR5380_hostdata *hostdata = shost_priv(instance);
|
||||
unsigned char status;
|
||||
int i;
|
||||
|
||||
@@ -441,14 +440,14 @@ static void prepare_info(struct Scsi_Host *instance)
|
||||
struct NCR5380_hostdata *hostdata = shost_priv(instance);
|
||||
|
||||
snprintf(hostdata->info, sizeof(hostdata->info),
|
||||
"%s, io_port 0x%lx, n_io_port %d, "
|
||||
"base 0x%lx, irq %d, "
|
||||
"%s, irq %d, "
|
||||
"io_port 0x%lx, base 0x%lx, "
|
||||
"can_queue %d, cmd_per_lun %d, "
|
||||
"sg_tablesize %d, this_id %d, "
|
||||
"flags { %s%s%s}, "
|
||||
"options { %s} ",
|
||||
instance->hostt->name, instance->io_port, instance->n_io_port,
|
||||
instance->base, instance->irq,
|
||||
instance->hostt->name, instance->irq,
|
||||
hostdata->io_port, hostdata->base,
|
||||
instance->can_queue, instance->cmd_per_lun,
|
||||
instance->sg_tablesize, instance->this_id,
|
||||
hostdata->flags & FLAG_DMA_FIXUP ? "DMA_FIXUP " : "",
|
||||
@@ -482,6 +481,7 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags)
|
||||
struct NCR5380_hostdata *hostdata = shost_priv(instance);
|
||||
int i;
|
||||
unsigned long deadline;
|
||||
unsigned long accesses_per_ms;
|
||||
|
||||
instance->max_lun = 7;
|
||||
|
||||
@@ -530,7 +530,8 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags)
|
||||
++i;
|
||||
cpu_relax();
|
||||
} while (time_is_after_jiffies(deadline));
|
||||
hostdata->accesses_per_ms = i / 256;
|
||||
accesses_per_ms = i / 256;
|
||||
hostdata->poll_loops = NCR5380_REG_POLL_TIME * accesses_per_ms / 2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -560,7 +561,7 @@ static int NCR5380_maybe_reset_bus(struct Scsi_Host *instance)
|
||||
case 3:
|
||||
case 5:
|
||||
shost_printk(KERN_ERR, instance, "SCSI bus busy, waiting up to five seconds\n");
|
||||
NCR5380_poll_politely(instance,
|
||||
NCR5380_poll_politely(hostdata,
|
||||
STATUS_REG, SR_BSY, 0, 5 * HZ);
|
||||
break;
|
||||
case 2:
|
||||
@@ -871,7 +872,7 @@ static void NCR5380_dma_complete(struct Scsi_Host *instance)
|
||||
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
|
||||
NCR5380_read(RESET_PARITY_INTERRUPT_REG);
|
||||
|
||||
transferred = hostdata->dma_len - NCR5380_dma_residual(instance);
|
||||
transferred = hostdata->dma_len - NCR5380_dma_residual(hostdata);
|
||||
hostdata->dma_len = 0;
|
||||
|
||||
data = (unsigned char **)&hostdata->connected->SCp.ptr;
|
||||
@@ -994,7 +995,7 @@ static irqreturn_t __maybe_unused NCR5380_intr(int irq, void *dev_id)
|
||||
}
|
||||
handled = 1;
|
||||
} else {
|
||||
shost_printk(KERN_NOTICE, instance, "interrupt without IRQ bit\n");
|
||||
dsprintk(NDEBUG_INTR, instance, "interrupt without IRQ bit\n");
|
||||
#ifdef SUN3_SCSI_VME
|
||||
dregs->csr |= CSR_DMA_ENABLE;
|
||||
#endif
|
||||
@@ -1075,7 +1076,7 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,
|
||||
*/
|
||||
|
||||
spin_unlock_irq(&hostdata->lock);
|
||||
err = NCR5380_poll_politely2(instance, MODE_REG, MR_ARBITRATE, 0,
|
||||
err = NCR5380_poll_politely2(hostdata, MODE_REG, MR_ARBITRATE, 0,
|
||||
INITIATOR_COMMAND_REG, ICR_ARBITRATION_PROGRESS,
|
||||
ICR_ARBITRATION_PROGRESS, HZ);
|
||||
spin_lock_irq(&hostdata->lock);
|
||||
@@ -1201,7 +1202,7 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,
|
||||
* selection.
|
||||
*/
|
||||
|
||||
err = NCR5380_poll_politely(instance, STATUS_REG, SR_BSY, SR_BSY,
|
||||
err = NCR5380_poll_politely(hostdata, STATUS_REG, SR_BSY, SR_BSY,
|
||||
msecs_to_jiffies(250));
|
||||
|
||||
if ((NCR5380_read(STATUS_REG) & (SR_SEL | SR_IO)) == (SR_SEL | SR_IO)) {
|
||||
@@ -1247,7 +1248,7 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,
|
||||
|
||||
/* Wait for start of REQ/ACK handshake */
|
||||
|
||||
err = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ);
|
||||
err = NCR5380_poll_politely(hostdata, STATUS_REG, SR_REQ, SR_REQ, HZ);
|
||||
spin_lock_irq(&hostdata->lock);
|
||||
if (err < 0) {
|
||||
shost_printk(KERN_ERR, instance, "select: REQ timeout\n");
|
||||
@@ -1318,6 +1319,7 @@ static int NCR5380_transfer_pio(struct Scsi_Host *instance,
|
||||
unsigned char *phase, int *count,
|
||||
unsigned char **data)
|
||||
{
|
||||
struct NCR5380_hostdata *hostdata = shost_priv(instance);
|
||||
unsigned char p = *phase, tmp;
|
||||
int c = *count;
|
||||
unsigned char *d = *data;
|
||||
@@ -1336,7 +1338,7 @@ static int NCR5380_transfer_pio(struct Scsi_Host *instance,
|
||||
* valid
|
||||
*/
|
||||
|
||||
if (NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ) < 0)
|
||||
if (NCR5380_poll_politely(hostdata, STATUS_REG, SR_REQ, SR_REQ, HZ) < 0)
|
||||
break;
|
||||
|
||||
dsprintk(NDEBUG_HANDSHAKE, instance, "REQ asserted\n");
|
||||
@@ -1381,7 +1383,7 @@ static int NCR5380_transfer_pio(struct Scsi_Host *instance,
|
||||
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ACK);
|
||||
}
|
||||
|
||||
if (NCR5380_poll_politely(instance,
|
||||
if (NCR5380_poll_politely(hostdata,
|
||||
STATUS_REG, SR_REQ, 0, 5 * HZ) < 0)
|
||||
break;
|
||||
|
||||
@@ -1440,6 +1442,7 @@ static int NCR5380_transfer_pio(struct Scsi_Host *instance,
|
||||
|
||||
static void do_reset(struct Scsi_Host *instance)
|
||||
{
|
||||
struct NCR5380_hostdata __maybe_unused *hostdata = shost_priv(instance);
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
@@ -1462,6 +1465,7 @@ static void do_reset(struct Scsi_Host *instance)
|
||||
|
||||
static int do_abort(struct Scsi_Host *instance)
|
||||
{
|
||||
struct NCR5380_hostdata *hostdata = shost_priv(instance);
|
||||
unsigned char *msgptr, phase, tmp;
|
||||
int len;
|
||||
int rc;
|
||||
@@ -1479,7 +1483,7 @@ static int do_abort(struct Scsi_Host *instance)
|
||||
* the target sees, so we just handshake.
|
||||
*/
|
||||
|
||||
rc = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, 10 * HZ);
|
||||
rc = NCR5380_poll_politely(hostdata, STATUS_REG, SR_REQ, SR_REQ, 10 * HZ);
|
||||
if (rc < 0)
|
||||
goto timeout;
|
||||
|
||||
@@ -1490,7 +1494,7 @@ static int do_abort(struct Scsi_Host *instance)
|
||||
if (tmp != PHASE_MSGOUT) {
|
||||
NCR5380_write(INITIATOR_COMMAND_REG,
|
||||
ICR_BASE | ICR_ASSERT_ATN | ICR_ASSERT_ACK);
|
||||
rc = NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, 0, 3 * HZ);
|
||||
rc = NCR5380_poll_politely(hostdata, STATUS_REG, SR_REQ, 0, 3 * HZ);
|
||||
if (rc < 0)
|
||||
goto timeout;
|
||||
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
|
||||
@@ -1575,9 +1579,9 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,
|
||||
* starting the NCR. This is also the cleaner way for the TT.
|
||||
*/
|
||||
if (p & SR_IO)
|
||||
result = NCR5380_dma_recv_setup(instance, d, c);
|
||||
result = NCR5380_dma_recv_setup(hostdata, d, c);
|
||||
else
|
||||
result = NCR5380_dma_send_setup(instance, d, c);
|
||||
result = NCR5380_dma_send_setup(hostdata, d, c);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1609,9 +1613,9 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,
|
||||
* NCR access, else the DMA setup gets trashed!
|
||||
*/
|
||||
if (p & SR_IO)
|
||||
result = NCR5380_dma_recv_setup(instance, d, c);
|
||||
result = NCR5380_dma_recv_setup(hostdata, d, c);
|
||||
else
|
||||
result = NCR5380_dma_send_setup(instance, d, c);
|
||||
result = NCR5380_dma_send_setup(hostdata, d, c);
|
||||
}
|
||||
|
||||
/* On failure, NCR5380_dma_xxxx_setup() returns a negative int. */
|
||||
@@ -1678,12 +1682,12 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,
|
||||
* byte.
|
||||
*/
|
||||
|
||||
if (NCR5380_poll_politely(instance, BUS_AND_STATUS_REG,
|
||||
if (NCR5380_poll_politely(hostdata, BUS_AND_STATUS_REG,
|
||||
BASR_DRQ, BASR_DRQ, HZ) < 0) {
|
||||
result = -1;
|
||||
shost_printk(KERN_ERR, instance, "PDMA read: DRQ timeout\n");
|
||||
}
|
||||
if (NCR5380_poll_politely(instance, STATUS_REG,
|
||||
if (NCR5380_poll_politely(hostdata, STATUS_REG,
|
||||
SR_REQ, 0, HZ) < 0) {
|
||||
result = -1;
|
||||
shost_printk(KERN_ERR, instance, "PDMA read: !REQ timeout\n");
|
||||
@@ -1694,7 +1698,7 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,
|
||||
* Wait for the last byte to be sent. If REQ is being asserted for
|
||||
* the byte we're interested, we'll ACK it and it will go false.
|
||||
*/
|
||||
if (NCR5380_poll_politely2(instance,
|
||||
if (NCR5380_poll_politely2(hostdata,
|
||||
BUS_AND_STATUS_REG, BASR_DRQ, BASR_DRQ,
|
||||
BUS_AND_STATUS_REG, BASR_PHASE_MATCH, 0, HZ) < 0) {
|
||||
result = -1;
|
||||
@@ -1751,22 +1755,26 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
|
||||
NCR5380_dprint_phase(NDEBUG_INFORMATION, instance);
|
||||
}
|
||||
#ifdef CONFIG_SUN3
|
||||
if (phase == PHASE_CMDOUT) {
|
||||
void *d;
|
||||
unsigned long count;
|
||||
if (phase == PHASE_CMDOUT &&
|
||||
sun3_dma_setup_done != cmd) {
|
||||
int count;
|
||||
|
||||
if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
|
||||
count = cmd->SCp.buffer->length;
|
||||
d = sg_virt(cmd->SCp.buffer);
|
||||
} else {
|
||||
count = cmd->SCp.this_residual;
|
||||
d = cmd->SCp.ptr;
|
||||
++cmd->SCp.buffer;
|
||||
--cmd->SCp.buffers_residual;
|
||||
cmd->SCp.this_residual = cmd->SCp.buffer->length;
|
||||
cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
|
||||
}
|
||||
|
||||
if (sun3_dma_setup_done != cmd &&
|
||||
sun3scsi_dma_xfer_len(count, cmd) > 0) {
|
||||
sun3scsi_dma_setup(instance, d, count,
|
||||
rq_data_dir(cmd->request));
|
||||
count = sun3scsi_dma_xfer_len(hostdata, cmd);
|
||||
|
||||
if (count > 0) {
|
||||
if (rq_data_dir(cmd->request))
|
||||
sun3scsi_dma_send_setup(hostdata,
|
||||
cmd->SCp.ptr, count);
|
||||
else
|
||||
sun3scsi_dma_recv_setup(hostdata,
|
||||
cmd->SCp.ptr, count);
|
||||
sun3_dma_setup_done = cmd;
|
||||
}
|
||||
#ifdef SUN3_SCSI_VME
|
||||
@@ -1827,7 +1835,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
|
||||
|
||||
transfersize = 0;
|
||||
if (!cmd->device->borken)
|
||||
transfersize = NCR5380_dma_xfer_len(instance, cmd, phase);
|
||||
transfersize = NCR5380_dma_xfer_len(hostdata, cmd);
|
||||
|
||||
if (transfersize > 0) {
|
||||
len = transfersize;
|
||||
@@ -2073,7 +2081,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
|
||||
} /* switch(phase) */
|
||||
} else {
|
||||
spin_unlock_irq(&hostdata->lock);
|
||||
NCR5380_poll_politely(instance, STATUS_REG, SR_REQ, SR_REQ, HZ);
|
||||
NCR5380_poll_politely(hostdata, STATUS_REG, SR_REQ, SR_REQ, HZ);
|
||||
spin_lock_irq(&hostdata->lock);
|
||||
}
|
||||
}
|
||||
@@ -2119,7 +2127,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance)
|
||||
*/
|
||||
|
||||
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_BSY);
|
||||
if (NCR5380_poll_politely(instance,
|
||||
if (NCR5380_poll_politely(hostdata,
|
||||
STATUS_REG, SR_SEL, 0, 2 * HZ) < 0) {
|
||||
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
|
||||
return;
|
||||
@@ -2130,7 +2138,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance)
|
||||
* Wait for target to go into MSGIN.
|
||||
*/
|
||||
|
||||
if (NCR5380_poll_politely(instance,
|
||||
if (NCR5380_poll_politely(hostdata,
|
||||
STATUS_REG, SR_REQ, SR_REQ, 2 * HZ) < 0) {
|
||||
do_abort(instance);
|
||||
return;
|
||||
@@ -2204,22 +2212,25 @@ static void NCR5380_reselect(struct Scsi_Host *instance)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SUN3
|
||||
{
|
||||
void *d;
|
||||
unsigned long count;
|
||||
if (sun3_dma_setup_done != tmp) {
|
||||
int count;
|
||||
|
||||
if (!tmp->SCp.this_residual && tmp->SCp.buffers_residual) {
|
||||
count = tmp->SCp.buffer->length;
|
||||
d = sg_virt(tmp->SCp.buffer);
|
||||
} else {
|
||||
count = tmp->SCp.this_residual;
|
||||
d = tmp->SCp.ptr;
|
||||
++tmp->SCp.buffer;
|
||||
--tmp->SCp.buffers_residual;
|
||||
tmp->SCp.this_residual = tmp->SCp.buffer->length;
|
||||
tmp->SCp.ptr = sg_virt(tmp->SCp.buffer);
|
||||
}
|
||||
|
||||
if (sun3_dma_setup_done != tmp &&
|
||||
sun3scsi_dma_xfer_len(count, tmp) > 0) {
|
||||
sun3scsi_dma_setup(instance, d, count,
|
||||
rq_data_dir(tmp->request));
|
||||
count = sun3scsi_dma_xfer_len(hostdata, tmp);
|
||||
|
||||
if (count > 0) {
|
||||
if (rq_data_dir(tmp->request))
|
||||
sun3scsi_dma_send_setup(hostdata,
|
||||
tmp->SCp.ptr, count);
|
||||
else
|
||||
sun3scsi_dma_recv_setup(hostdata,
|
||||
tmp->SCp.ptr, count);
|
||||
sun3_dma_setup_done = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
+63
-24
@@ -219,27 +219,32 @@
|
||||
#define FLAG_TOSHIBA_DELAY 128 /* Allow for borken CD-ROMs */
|
||||
|
||||
struct NCR5380_hostdata {
|
||||
NCR5380_implementation_fields; /* implementation specific */
|
||||
struct Scsi_Host *host; /* Host backpointer */
|
||||
unsigned char id_mask, id_higher_mask; /* 1 << id, all bits greater */
|
||||
unsigned char busy[8]; /* index = target, bit = lun */
|
||||
int dma_len; /* requested length of DMA */
|
||||
unsigned char last_message; /* last message OUT */
|
||||
struct scsi_cmnd *connected; /* currently connected cmnd */
|
||||
struct scsi_cmnd *selecting; /* cmnd to be connected */
|
||||
struct list_head unissued; /* waiting to be issued */
|
||||
struct list_head autosense; /* priority issue queue */
|
||||
struct list_head disconnected; /* waiting for reconnect */
|
||||
spinlock_t lock; /* protects this struct */
|
||||
int flags;
|
||||
struct scsi_eh_save ses;
|
||||
struct scsi_cmnd *sensing;
|
||||
NCR5380_implementation_fields; /* Board-specific data */
|
||||
u8 __iomem *io; /* Remapped 5380 address */
|
||||
u8 __iomem *pdma_io; /* Remapped PDMA address */
|
||||
unsigned long poll_loops; /* Register polling limit */
|
||||
spinlock_t lock; /* Protects this struct */
|
||||
struct scsi_cmnd *connected; /* Currently connected cmnd */
|
||||
struct list_head disconnected; /* Waiting for reconnect */
|
||||
struct Scsi_Host *host; /* SCSI host backpointer */
|
||||
struct workqueue_struct *work_q; /* SCSI host work queue */
|
||||
struct work_struct main_task; /* Work item for main loop */
|
||||
int flags; /* Board-specific quirks */
|
||||
int dma_len; /* Requested length of DMA */
|
||||
int read_overruns; /* Transfer size reduction for DMA erratum */
|
||||
unsigned long io_port; /* Device IO port */
|
||||
unsigned long base; /* Device base address */
|
||||
struct list_head unissued; /* Waiting to be issued */
|
||||
struct scsi_cmnd *selecting; /* Cmnd to be connected */
|
||||
struct list_head autosense; /* Priority cmnd queue */
|
||||
struct scsi_cmnd *sensing; /* Cmnd needing autosense */
|
||||
struct scsi_eh_save ses; /* Cmnd state saved for EH */
|
||||
unsigned char busy[8]; /* Index = target, bit = lun */
|
||||
unsigned char id_mask; /* 1 << Host ID */
|
||||
unsigned char id_higher_mask; /* All bits above id_mask */
|
||||
unsigned char last_message; /* Last Message Out */
|
||||
unsigned long region_size; /* Size of address/port range */
|
||||
char info[256];
|
||||
int read_overruns; /* number of bytes to cut from a
|
||||
* transfer to handle chip overruns */
|
||||
struct work_struct main_task;
|
||||
struct workqueue_struct *work_q;
|
||||
unsigned long accesses_per_ms; /* chip register accesses per ms */
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
@@ -252,6 +257,9 @@ struct NCR5380_cmd {
|
||||
|
||||
#define NCR5380_PIO_CHUNK_SIZE 256
|
||||
|
||||
/* Time limit (ms) to poll registers when IRQs are disabled, e.g. during PDMA */
|
||||
#define NCR5380_REG_POLL_TIME 15
|
||||
|
||||
static inline struct scsi_cmnd *NCR5380_to_scmd(struct NCR5380_cmd *ncmd_ptr)
|
||||
{
|
||||
return ((struct scsi_cmnd *)ncmd_ptr) - 1;
|
||||
@@ -294,14 +302,45 @@ static void NCR5380_reselect(struct Scsi_Host *instance);
|
||||
static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *, struct scsi_cmnd *);
|
||||
static int NCR5380_transfer_dma(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
|
||||
static int NCR5380_transfer_pio(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data);
|
||||
static int NCR5380_poll_politely2(struct Scsi_Host *, int, int, int, int, int, int, int);
|
||||
static int NCR5380_poll_politely2(struct NCR5380_hostdata *,
|
||||
unsigned int, u8, u8,
|
||||
unsigned int, u8, u8, unsigned long);
|
||||
|
||||
static inline int NCR5380_poll_politely(struct Scsi_Host *instance,
|
||||
int reg, int bit, int val, int wait)
|
||||
static inline int NCR5380_poll_politely(struct NCR5380_hostdata *hostdata,
|
||||
unsigned int reg, u8 bit, u8 val,
|
||||
unsigned long wait)
|
||||
{
|
||||
return NCR5380_poll_politely2(instance, reg, bit, val,
|
||||
if ((NCR5380_read(reg) & bit) == val)
|
||||
return 0;
|
||||
|
||||
return NCR5380_poll_politely2(hostdata, reg, bit, val,
|
||||
reg, bit, val, wait);
|
||||
}
|
||||
|
||||
static int NCR5380_dma_xfer_len(struct NCR5380_hostdata *,
|
||||
struct scsi_cmnd *);
|
||||
static int NCR5380_dma_send_setup(struct NCR5380_hostdata *,
|
||||
unsigned char *, int);
|
||||
static int NCR5380_dma_recv_setup(struct NCR5380_hostdata *,
|
||||
unsigned char *, int);
|
||||
static int NCR5380_dma_residual(struct NCR5380_hostdata *);
|
||||
|
||||
static inline int NCR5380_dma_xfer_none(struct NCR5380_hostdata *hostdata,
|
||||
struct scsi_cmnd *cmd)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int NCR5380_dma_setup_none(struct NCR5380_hostdata *hostdata,
|
||||
unsigned char *data, int count)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int NCR5380_dma_residual_none(struct NCR5380_hostdata *hostdata)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* NCR5380_H */
|
||||
|
||||
@@ -1246,7 +1246,6 @@ struct aac_dev
|
||||
u32 max_msix; /* max. MSI-X vectors */
|
||||
u32 vector_cap; /* MSI-X vector capab.*/
|
||||
int msi_enabled; /* MSI/MSI-X enabled */
|
||||
struct msix_entry msixentry[AAC_MAX_MSIX];
|
||||
struct aac_msix_ctx aac_msix[AAC_MAX_MSIX]; /* context */
|
||||
u8 adapter_shutdown;
|
||||
u32 handle_pci_error;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user