lkml.org 
[lkml]   [2009]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3/4] scsi: megaraid_sas - driver fixed the device update issue
    driver fixed the device update issue after get the AEN PD delete/ADD and LD add/delete from FW.

    Signed-off-by Bo Yang<bo.yang@lsi.com>

    ---
    megaraid_sas.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 142 insertions(+)

    diff -rupN old/drivers/scsi/megaraid/megaraid_sas.c new/drivers/scsi/megaraid/megaraid_sas.c
    --- old/drivers/scsi/megaraid/megaraid_sas.c 2009-12-06 03:51:57.000000000 -0500
    +++ new/drivers/scsi/megaraid/megaraid_sas.c 2009-12-06 04:42:17.000000000 -0500
    @@ -4068,6 +4068,7 @@ megasas_aen_polling(struct work_struct *
    struct Scsi_Host *host;
    struct scsi_device *sdev1;
    u16 pd_index = 0;
    + u16 ld_index = 0;
    int i, j, doscan = 0;
    u32 seq_num;
    int error;
    @@ -4083,8 +4084,124 @@ megasas_aen_polling(struct work_struct *

    switch (instance->evt_detail->code) {
    case MR_EVT_PD_INSERTED:
    + if (megasas_get_pd_list(instance) == 0) {
    + for (i = 0; i < MEGASAS_MAX_PD_CHANNELS; i++) {
    + for (j = 0;
    + j < MEGASAS_MAX_DEV_PER_CHANNEL;
    + j++) {
    +
    + pd_index =
    + (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
    +
    + sdev1 =
    + scsi_device_lookup(host, i, j, 0);
    +
    + if (instance->pd_list[pd_index].driveState
    + == MR_PD_STATE_SYSTEM) {
    + if (!sdev1) {
    + scsi_add_device(host, i, j, 0);
    + }
    +
    + if (sdev1)
    + scsi_device_put(sdev1);
    + }
    + }
    + }
    + }
    + doscan = 0;
    + break;
    +
    case MR_EVT_PD_REMOVED:
    + if (megasas_get_pd_list(instance) == 0) {
    + megasas_get_pd_list(instance);
    + for (i = 0; i < MEGASAS_MAX_PD_CHANNELS; i++) {
    + for (j = 0;
    + j < MEGASAS_MAX_DEV_PER_CHANNEL;
    + j++) {
    +
    + pd_index =
    + (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
    +
    + sdev1 =
    + scsi_device_lookup(host, i, j, 0);
    +
    + if (instance->pd_list[pd_index].driveState
    + == MR_PD_STATE_SYSTEM) {
    + if (sdev1) {
    + scsi_device_put(sdev1);
    + }
    + } else {
    + if (sdev1) {
    + scsi_remove_device(sdev1);
    + scsi_device_put(sdev1);
    + }
    + }
    + }
    + }
    + }
    + doscan = 0;
    + break;
    +
    + case MR_EVT_LD_OFFLINE:
    + case MR_EVT_LD_DELETED:
    + megasas_get_ld_list(instance);
    + for (i = 0; i < MEGASAS_MAX_LD_CHANNELS; i++) {
    + for (j = 0;
    + j < MEGASAS_MAX_DEV_PER_CHANNEL;
    + j++) {
    +
    + ld_index =
    + (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
    +
    + sdev1 = scsi_device_lookup(host,
    + i + MEGASAS_MAX_LD_CHANNELS,
    + j,
    + 0);
    +
    + if (instance->ld_ids[ld_index] != 0xff) {
    + if (sdev1) {
    + scsi_device_put(sdev1);
    + }
    + } else {
    + if (sdev1) {
    + scsi_remove_device(sdev1);
    + scsi_device_put(sdev1);
    + }
    + }
    + }
    + }
    + doscan = 0;
    + break;
    + case MR_EVT_LD_CREATED:
    + megasas_get_ld_list(instance);
    + for (i = 0; i < MEGASAS_MAX_LD_CHANNELS; i++) {
    + for (j = 0;
    + j < MEGASAS_MAX_DEV_PER_CHANNEL;
    + j++) {
    + ld_index =
    + (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
    +
    + sdev1 = scsi_device_lookup(host,
    + i+MEGASAS_MAX_LD_CHANNELS,
    + j, 0);
    +
    + if (instance->ld_ids[ld_index] !=
    + 0xff) {
    + if (!sdev1) {
    + scsi_add_device(host,
    + i + 2,
    + j, 0);
    + }
    + }
    + if (sdev1) {
    + scsi_device_put(sdev1);
    + }
    + }
    + }
    + doscan = 0;
    + break;
    case MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED:
    + case MR_EVT_FOREIGN_CFG_IMPORTED:
    doscan = 1;
    break;
    default:
    @@ -4119,6 +4236,31 @@ megasas_aen_polling(struct work_struct *
    }
    }
    }
    +
    + megasas_get_ld_list(instance);
    + for (i = 0; i < MEGASAS_MAX_LD_CHANNELS; i++) {
    + for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL; j++) {
    + ld_index =
    + (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
    +
    + sdev1 = scsi_device_lookup(host,
    + i+MEGASAS_MAX_LD_CHANNELS, j, 0);
    + if (instance->ld_ids[ld_index] != 0xff) {
    + if (!sdev1) {
    + scsi_add_device(host,
    + i+2,
    + j, 0);
    + } else {
    + scsi_device_put(sdev1);
    + }
    + } else {
    + if (sdev1) {
    + scsi_remove_device(sdev1);
    + scsi_device_put(sdev1);
    + }
    + }
    + }
    + }
    }

    if ( instance->aen_cmd != NULL ) {

    \
     
     \ /
      Last update: 2009-12-06 16:41    [W:0.052 / U:120.212 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site