Skip to content

Commit

Permalink
qla2xxx: Disable laser for ISP2031 while unloading driver.
Browse files Browse the repository at this point in the history
Nameserver data on FC switch is not refreshed when
qla2xxx driver is unloaded. Disabling laser for
ISP2031 will force FC switch to rescan ports and
clear fdmi entries from Nameserver.

Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
  • Loading branch information
Himanshu Madhani authored and Christoph Hellwig committed Sep 25, 2014
1 parent 25232cc commit 2d5a4c3
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
2 changes: 1 addition & 1 deletion drivers/scsi/qla2xxx/qla_dbg.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* ----------------------------------------------------------------------
* | Level | Last Value Used | Holes |
* ----------------------------------------------------------------------
* | Module Init and Probe | 0x017d | 0x004b,0x0141 |
* | Module Init and Probe | 0x017d | 0x0141 |
* | | | 0x0144,0x0146 |
* | | | 0x015b-0x0160 |
* | | | 0x016e-0x0170 |
Expand Down
5 changes: 5 additions & 0 deletions drivers/scsi/qla2xxx/qla_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,11 @@
* reset-recovery completion is
* second
*/
/* ISP2031: Values for laser on/off */
#define PORT_0_2031 0x00201340
#define PORT_1_2031 0x00201350
#define LASER_ON_2031 0x01800100
#define LASER_OFF_2031 0x01800180

/*
* The ISP2312 v2 chip cannot access the FLASH/GPIO registers via MMIO in an
Expand Down
31 changes: 31 additions & 0 deletions drivers/scsi/qla2xxx/qla_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ static int qla2x00_change_queue_depth(struct scsi_device *, int, int);
static int qla2x00_change_queue_type(struct scsi_device *, int);
static void qla2x00_clear_drv_active(struct qla_hw_data *);
static void qla2x00_free_device(scsi_qla_host_t *);
static void qla83xx_disable_laser(scsi_qla_host_t *vha);

struct scsi_host_template qla2xxx_driver_template = {
.module = THIS_MODULE,
Expand Down Expand Up @@ -3177,6 +3178,10 @@ qla2x00_remove_one(struct pci_dev *pdev)

qla84xx_put_chip(base_vha);

/* Laser should be disabled only for ISP2031 */
if (IS_QLA2031(ha))
qla83xx_disable_laser(base_vha);

/* Disable timer */
if (base_vha->timer_active)
qla2x00_stop_timer(base_vha);
Expand Down Expand Up @@ -5701,6 +5706,32 @@ qla2xxx_pci_resume(struct pci_dev *pdev)
ha->flags.eeh_busy = 0;
}

static void
qla83xx_disable_laser(scsi_qla_host_t *vha)
{
uint32_t reg, data, fn;
struct qla_hw_data *ha = vha->hw;
struct device_reg_24xx __iomem *isp_reg = &ha->iobase->isp24;

/* pci func #/port # */
ql_dbg(ql_dbg_init, vha, 0x004b,
"Disabling Laser for hba: %p\n", vha);

fn = (RD_REG_DWORD(&isp_reg->ctrl_status) &
(BIT_15|BIT_14|BIT_13|BIT_12));

fn = (fn >> 12);

if (fn & 1)
reg = PORT_1_2031;
else
reg = PORT_0_2031;

data = LASER_OFF_2031;

qla83xx_wr_reg(vha, reg, data);
}

static const struct pci_error_handlers qla2xxx_err_handler = {
.error_detected = qla2xxx_pci_error_detected,
.mmio_enabled = qla2xxx_pci_mmio_enabled,
Expand Down

0 comments on commit 2d5a4c3

Please sign in to comment.