Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (204 commits) [SCSI] qla4xxx: export address/port of connection (fix udev disk names) [SCSI] ipr: Fix BUG on adapter dump timeout [SCSI] megaraid_sas: Fix instance access in megasas_reset_timer [SCSI] hpsa: change confusing message to be more clear [SCSI] iscsi class: fix vlan configuration [SCSI] qla4xxx: fix data alignment and use nl helpers [SCSI] iscsi class: fix link local mispelling [SCSI] iscsi class: Replace iscsi_get_next_target_id with IDA [SCSI] aacraid: use lower snprintf() limit [SCSI] lpfc 8.3.27: Change driver version to 8.3.27 [SCSI] lpfc 8.3.27: T10 additions for SLI4 [SCSI] lpfc 8.3.27: Fix queue allocation failure recovery [SCSI] lpfc 8.3.27: Change algorithm for getting physical port name [SCSI] lpfc 8.3.27: Changed worst case mailbox timeout [SCSI] lpfc 8.3.27: Miscellanous logic and interface fixes [SCSI] megaraid_sas: Changelog and version update [SCSI] megaraid_sas: Add driver workaround for PERC5/1068 kdump kernel panic [SCSI] megaraid_sas: Add multiple MSI-X vector/multiple reply queue support [SCSI] megaraid_sas: Add support for MegaRAID 9360/9380 12GB/s controllers [SCSI] megaraid_sas: Clear FUSION_IN_RESET before enabling interrupts ...
This commit is contained in:
@@ -398,6 +398,16 @@ static int __devinit mvs_94xx_init(struct mvs_info *mvi)
|
||||
/* init phys */
|
||||
mvs_phy_hacks(mvi);
|
||||
|
||||
/* disable non data frame retry */
|
||||
tmp = mvs_cr32(mvi, CMD_SAS_CTL1);
|
||||
if ((revision == VANIR_A0_REV) ||
|
||||
(revision == VANIR_B0_REV) ||
|
||||
(revision == VANIR_C0_REV)) {
|
||||
tmp &= ~0xffff;
|
||||
tmp |= 0x007f;
|
||||
mvs_cw32(mvi, CMD_SAS_CTL1, tmp);
|
||||
}
|
||||
|
||||
/* set LED blink when IO*/
|
||||
mw32(MVS_PA_VSR_ADDR, VSR_PHY_ACT_LED);
|
||||
tmp = mr32(MVS_PA_VSR_PORT);
|
||||
@@ -500,6 +510,27 @@ static int __devinit mvs_94xx_init(struct mvs_info *mvi)
|
||||
tmp |= CINT_PHY_MASK;
|
||||
mw32(MVS_INT_MASK, tmp);
|
||||
|
||||
tmp = mvs_cr32(mvi, CMD_LINK_TIMER);
|
||||
tmp |= 0xFFFF0000;
|
||||
mvs_cw32(mvi, CMD_LINK_TIMER, tmp);
|
||||
|
||||
/* tune STP performance */
|
||||
tmp = 0x003F003F;
|
||||
mvs_cw32(mvi, CMD_PL_TIMER, tmp);
|
||||
|
||||
/* This can improve expander large block size seq write performance */
|
||||
tmp = mvs_cr32(mvi, CMD_PORT_LAYER_TIMER1);
|
||||
tmp |= 0xFFFF007F;
|
||||
mvs_cw32(mvi, CMD_PORT_LAYER_TIMER1, tmp);
|
||||
|
||||
/* change the connection open-close behavior (bit 9)
|
||||
* set bit8 to 1 for performance tuning */
|
||||
tmp = mvs_cr32(mvi, CMD_SL_MODE0);
|
||||
tmp |= 0x00000300;
|
||||
/* set bit0 to 0 to enable retry for no_dest reject case */
|
||||
tmp &= 0xFFFFFFFE;
|
||||
mvs_cw32(mvi, CMD_SL_MODE0, tmp);
|
||||
|
||||
/* Enable SRS interrupt */
|
||||
mw32(MVS_INT_MASK_SRS_0, 0xFFFF);
|
||||
|
||||
@@ -823,6 +854,10 @@ static void mvs_94xx_fix_phy_info(struct mvs_info *mvi, int i,
|
||||
phy->att_dev_info = PORT_DEV_STP_TRGT | 1;
|
||||
}
|
||||
|
||||
/* enable spin up bit */
|
||||
mvs_write_port_cfg_addr(mvi, i, PHYR_PHY_STAT);
|
||||
mvs_write_port_cfg_data(mvi, i, 0x04);
|
||||
|
||||
}
|
||||
|
||||
void mvs_94xx_phy_set_link_rate(struct mvs_info *mvi, u32 phy_id,
|
||||
|
@@ -387,6 +387,8 @@ enum sas_cmd_port_registers {
|
||||
CMD_SL_MODE0 = 0x1BC, /* SL Mode 0 */
|
||||
CMD_SL_MODE1 = 0x1C0, /* SL Mode 1 */
|
||||
CMD_PND_FIFO_CTL1 = 0x1C4, /* Pending FIFO Control 1 */
|
||||
CMD_PORT_LAYER_TIMER1 = 0x1E0, /* Port Layer Timer 1 */
|
||||
CMD_LINK_TIMER = 0x1E4, /* Link Timer */
|
||||
};
|
||||
|
||||
enum mvs_info_flags {
|
||||
|
@@ -59,7 +59,7 @@ static struct scsi_host_template mvs_sht = {
|
||||
.name = DRV_NAME,
|
||||
.queuecommand = sas_queuecommand,
|
||||
.target_alloc = sas_target_alloc,
|
||||
.slave_configure = mvs_slave_configure,
|
||||
.slave_configure = sas_slave_configure,
|
||||
.slave_destroy = sas_slave_destroy,
|
||||
.scan_finished = mvs_scan_finished,
|
||||
.scan_start = mvs_scan_start,
|
||||
@@ -74,7 +74,7 @@ static struct scsi_host_template mvs_sht = {
|
||||
.use_clustering = ENABLE_CLUSTERING,
|
||||
.eh_device_reset_handler = sas_eh_device_reset_handler,
|
||||
.eh_bus_reset_handler = sas_eh_bus_reset_handler,
|
||||
.slave_alloc = mvs_slave_alloc,
|
||||
.slave_alloc = sas_slave_alloc,
|
||||
.target_destroy = sas_target_destroy,
|
||||
.ioctl = sas_ioctl,
|
||||
.shost_attrs = mvst_host_attrs,
|
||||
@@ -705,6 +705,15 @@ static struct pci_device_id __devinitdata mvs_pci_table[] = {
|
||||
{ PCI_VDEVICE(TTI, 0x2740), chip_9480 },
|
||||
{ PCI_VDEVICE(TTI, 0x2744), chip_9480 },
|
||||
{ PCI_VDEVICE(TTI, 0x2760), chip_9480 },
|
||||
{
|
||||
.vendor = 0x1b4b,
|
||||
.device = 0x9480,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = 0x9480,
|
||||
.class = 0,
|
||||
.class_mask = 0,
|
||||
.driver_data = chip_9480,
|
||||
},
|
||||
{
|
||||
.vendor = 0x1b4b,
|
||||
.device = 0x9445,
|
||||
|
@@ -214,7 +214,7 @@ int mvs_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
|
||||
break;
|
||||
case PHY_FUNC_RELEASE_SPINUP_HOLD:
|
||||
default:
|
||||
rc = -EOPNOTSUPP;
|
||||
rc = -ENOSYS;
|
||||
}
|
||||
msleep(200);
|
||||
return rc;
|
||||
@@ -265,6 +265,12 @@ static void mvs_bytes_dmaed(struct mvs_info *mvi, int i)
|
||||
id->dev_type = phy->identify.device_type;
|
||||
id->initiator_bits = SAS_PROTOCOL_ALL;
|
||||
id->target_bits = phy->identify.target_port_protocols;
|
||||
|
||||
/* direct attached SAS device */
|
||||
if (phy->att_dev_info & PORT_SSP_TRGT_MASK) {
|
||||
MVS_CHIP_DISP->write_port_cfg_addr(mvi, i, PHYR_PHY_STAT);
|
||||
MVS_CHIP_DISP->write_port_cfg_data(mvi, i, 0x00);
|
||||
}
|
||||
} else if (phy->phy_type & PORT_TYPE_SATA) {
|
||||
/*Nothing*/
|
||||
}
|
||||
@@ -276,36 +282,6 @@ static void mvs_bytes_dmaed(struct mvs_info *mvi, int i)
|
||||
PORTE_BYTES_DMAED);
|
||||
}
|
||||
|
||||
int mvs_slave_alloc(struct scsi_device *scsi_dev)
|
||||
{
|
||||
struct domain_device *dev = sdev_to_domain_dev(scsi_dev);
|
||||
if (dev_is_sata(dev)) {
|
||||
/* We don't need to rescan targets
|
||||
* if REPORT_LUNS request is failed
|
||||
*/
|
||||
if (scsi_dev->lun > 0)
|
||||
return -ENXIO;
|
||||
scsi_dev->tagged_supported = 1;
|
||||
}
|
||||
|
||||
return sas_slave_alloc(scsi_dev);
|
||||
}
|
||||
|
||||
int mvs_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
struct domain_device *dev = sdev_to_domain_dev(sdev);
|
||||
int ret = sas_slave_configure(sdev);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
if (!dev_is_sata(dev)) {
|
||||
sas_change_queue_depth(sdev,
|
||||
MVS_QUEUE_SIZE,
|
||||
SCSI_QDEPTH_DEFAULT);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mvs_scan_start(struct Scsi_Host *shost)
|
||||
{
|
||||
int i, j;
|
||||
@@ -426,7 +402,7 @@ static int mvs_task_prep_smp(struct mvs_info *mvi,
|
||||
/* generate open address frame hdr (first 12 bytes) */
|
||||
/* initiator, SMP, ftype 1h */
|
||||
buf_oaf[0] = (1 << 7) | (PROTOCOL_SMP << 4) | 0x01;
|
||||
buf_oaf[1] = dev->linkrate & 0xf;
|
||||
buf_oaf[1] = min(sas_port->linkrate, dev->linkrate) & 0xf;
|
||||
*(u16 *)(buf_oaf + 2) = 0xFFFF; /* SAS SPEC */
|
||||
memcpy(buf_oaf + 4, dev->sas_addr, SAS_ADDR_SIZE);
|
||||
|
||||
@@ -571,7 +547,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi,
|
||||
/* generate open address frame hdr (first 12 bytes) */
|
||||
/* initiator, STP, ftype 1h */
|
||||
buf_oaf[0] = (1 << 7) | (PROTOCOL_STP << 4) | 0x1;
|
||||
buf_oaf[1] = dev->linkrate & 0xf;
|
||||
buf_oaf[1] = min(sas_port->linkrate, dev->linkrate) & 0xf;
|
||||
*(u16 *)(buf_oaf + 2) = cpu_to_be16(mvi_dev->device_id + 1);
|
||||
memcpy(buf_oaf + 4, dev->sas_addr, SAS_ADDR_SIZE);
|
||||
|
||||
@@ -679,7 +655,7 @@ static int mvs_task_prep_ssp(struct mvs_info *mvi,
|
||||
/* generate open address frame hdr (first 12 bytes) */
|
||||
/* initiator, SSP, ftype 1h */
|
||||
buf_oaf[0] = (1 << 7) | (PROTOCOL_SSP << 4) | 0x1;
|
||||
buf_oaf[1] = dev->linkrate & 0xf;
|
||||
buf_oaf[1] = min(sas_port->linkrate, dev->linkrate) & 0xf;
|
||||
*(u16 *)(buf_oaf + 2) = cpu_to_be16(mvi_dev->device_id + 1);
|
||||
memcpy(buf_oaf + 4, dev->sas_addr, SAS_ADDR_SIZE);
|
||||
|
||||
@@ -1241,6 +1217,12 @@ static void mvs_port_notify_formed(struct asd_sas_phy *sas_phy, int lock)
|
||||
port->wide_port_phymap = sas_port->phy_mask;
|
||||
mv_printk("set wide port phy map %x\n", sas_port->phy_mask);
|
||||
mvs_update_wideport(mvi, sas_phy->id);
|
||||
|
||||
/* direct attached SAS device */
|
||||
if (phy->att_dev_info & PORT_SSP_TRGT_MASK) {
|
||||
MVS_CHIP_DISP->write_port_cfg_addr(mvi, i, PHYR_PHY_STAT);
|
||||
MVS_CHIP_DISP->write_port_cfg_data(mvi, i, 0x04);
|
||||
}
|
||||
}
|
||||
if (lock)
|
||||
spin_unlock_irqrestore(&mvi->lock, flags);
|
||||
@@ -1387,28 +1369,6 @@ void mvs_dev_gone(struct domain_device *dev)
|
||||
mvs_dev_gone_notify(dev);
|
||||
}
|
||||
|
||||
static struct sas_task *mvs_alloc_task(void)
|
||||
{
|
||||
struct sas_task *task = kzalloc(sizeof(struct sas_task), GFP_KERNEL);
|
||||
|
||||
if (task) {
|
||||
INIT_LIST_HEAD(&task->list);
|
||||
spin_lock_init(&task->task_state_lock);
|
||||
task->task_state_flags = SAS_TASK_STATE_PENDING;
|
||||
init_timer(&task->timer);
|
||||
init_completion(&task->completion);
|
||||
}
|
||||
return task;
|
||||
}
|
||||
|
||||
static void mvs_free_task(struct sas_task *task)
|
||||
{
|
||||
if (task) {
|
||||
BUG_ON(!list_empty(&task->list));
|
||||
kfree(task);
|
||||
}
|
||||
}
|
||||
|
||||
static void mvs_task_done(struct sas_task *task)
|
||||
{
|
||||
if (!del_timer(&task->timer))
|
||||
@@ -1432,7 +1392,7 @@ static int mvs_exec_internal_tmf_task(struct domain_device *dev,
|
||||
struct sas_task *task = NULL;
|
||||
|
||||
for (retry = 0; retry < 3; retry++) {
|
||||
task = mvs_alloc_task();
|
||||
task = sas_alloc_task(GFP_KERNEL);
|
||||
if (!task)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -1490,15 +1450,14 @@ static int mvs_exec_internal_tmf_task(struct domain_device *dev,
|
||||
SAS_ADDR(dev->sas_addr),
|
||||
task->task_status.resp,
|
||||
task->task_status.stat);
|
||||
mvs_free_task(task);
|
||||
sas_free_task(task);
|
||||
task = NULL;
|
||||
|
||||
}
|
||||
}
|
||||
ex_err:
|
||||
BUG_ON(retry == 3 && task != NULL);
|
||||
if (task != NULL)
|
||||
mvs_free_task(task);
|
||||
sas_free_task(task);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@@ -46,7 +46,7 @@
|
||||
#include "mv_defs.h"
|
||||
|
||||
#define DRV_NAME "mvsas"
|
||||
#define DRV_VERSION "0.8.2"
|
||||
#define DRV_VERSION "0.8.16"
|
||||
#define MVS_ID_NOT_MAPPED 0x7f
|
||||
#define WIDE_PORT_MAX_PHY 4
|
||||
#define mv_printk(fmt, arg ...) \
|
||||
@@ -458,8 +458,6 @@ int mvs_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
|
||||
void *funcdata);
|
||||
void __devinit mvs_set_sas_addr(struct mvs_info *mvi, int port_id,
|
||||
u32 off_lo, u32 off_hi, u64 sas_addr);
|
||||
int mvs_slave_alloc(struct scsi_device *scsi_dev);
|
||||
int mvs_slave_configure(struct scsi_device *sdev);
|
||||
void mvs_scan_start(struct Scsi_Host *shost);
|
||||
int mvs_scan_finished(struct Scsi_Host *shost, unsigned long time);
|
||||
int mvs_queue_command(struct sas_task *task, const int num,
|
||||
|
Reference in New Issue
Block a user