Commit 31364329 authored by Raghava Aditya Renukunta's avatar Raghava Aditya Renukunta Committed by Martin K. Petersen

scsi: aacraid: Added new IWBR reset

Added a new IWBR soft reset type, reworked the IOP reset interface for
a bit.
Signed-off-by: default avatarRaghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Signed-off-by: default avatarDave Carroll <David.Carroll@microsemi.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 999b3ffc
...@@ -4007,8 +4007,6 @@ static long aac_build_sghba(struct scsi_cmnd *scsicmd, ...@@ -4007,8 +4007,6 @@ static long aac_build_sghba(struct scsi_cmnd *scsicmd,
u32 cur_size; u32 cur_size;
struct aac_hba_sgl *sge; struct aac_hba_sgl *sge;
nseg = scsi_dma_map(scsicmd); nseg = scsi_dma_map(scsicmd);
if (nseg <= 0) { if (nseg <= 0) {
byte_count = nseg; byte_count = nseg;
......
...@@ -878,7 +878,7 @@ struct adapter_ops ...@@ -878,7 +878,7 @@ struct adapter_ops
void (*adapter_enable_int)(struct aac_dev *dev); void (*adapter_enable_int)(struct aac_dev *dev);
int (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4); int (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4);
int (*adapter_check_health)(struct aac_dev *dev); int (*adapter_check_health)(struct aac_dev *dev);
int (*adapter_restart)(struct aac_dev *dev, int bled); int (*adapter_restart)(struct aac_dev *dev, int bled, u8 reset_type);
void (*adapter_start)(struct aac_dev *dev); void (*adapter_start)(struct aac_dev *dev);
/* Transport operations */ /* Transport operations */
int (*adapter_ioremap)(struct aac_dev * dev, u32 size); int (*adapter_ioremap)(struct aac_dev * dev, u32 size);
...@@ -1657,8 +1657,8 @@ struct aac_dev ...@@ -1657,8 +1657,8 @@ struct aac_dev
#define aac_adapter_check_health(dev) \ #define aac_adapter_check_health(dev) \
(dev)->a_ops.adapter_check_health(dev) (dev)->a_ops.adapter_check_health(dev)
#define aac_adapter_restart(dev,bled) \ #define aac_adapter_restart(dev, bled, reset_type) \
(dev)->a_ops.adapter_restart(dev,bled) ((dev)->a_ops.adapter_restart(dev, bled, reset_type))
#define aac_adapter_start(dev) \ #define aac_adapter_start(dev) \
((dev)->a_ops.adapter_start(dev)) ((dev)->a_ops.adapter_start(dev))
...@@ -2333,6 +2333,13 @@ struct revision ...@@ -2333,6 +2333,13 @@ struct revision
#define FSACTL_FORCE_DELETE_DISK CTL_CODE(2120, METHOD_NEITHER) #define FSACTL_FORCE_DELETE_DISK CTL_CODE(2120, METHOD_NEITHER)
#define FSACTL_GET_CONTAINERS 2131 #define FSACTL_GET_CONTAINERS 2131
#define FSACTL_SEND_LARGE_FIB CTL_CODE(2138, METHOD_BUFFERED) #define FSACTL_SEND_LARGE_FIB CTL_CODE(2138, METHOD_BUFFERED)
/* flags defined for IOP & HW SOFT RESET */
#define HW_IOP_RESET 0x01
#define HW_SOFT_RESET 0x02
#define IOP_HWSOFT_RESET (HW_IOP_RESET | HW_SOFT_RESET)
/* HW Soft Reset register offset */
#define IBW_SWR_OFFSET 0x4000
#define SOFT_RESET_TIME 60
struct aac_common struct aac_common
...@@ -2569,7 +2576,7 @@ unsigned int aac_command_normal(struct aac_queue * q); ...@@ -2569,7 +2576,7 @@ unsigned int aac_command_normal(struct aac_queue * q);
unsigned int aac_intr_normal(struct aac_dev *dev, u32 Index, unsigned int aac_intr_normal(struct aac_dev *dev, u32 Index,
int isAif, int isFastResponse, int isAif, int isFastResponse,
struct hw_fib *aif_fib); struct hw_fib *aif_fib);
int aac_reset_adapter(struct aac_dev * dev, int forced); int aac_reset_adapter(struct aac_dev *dev, int forced, u8 reset_type);
int aac_check_health(struct aac_dev * dev); int aac_check_health(struct aac_dev * dev);
int aac_command_thread(void *data); int aac_command_thread(void *data);
int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context *fibctx); int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context *fibctx);
......
...@@ -1455,7 +1455,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) ...@@ -1455,7 +1455,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
} }
} }
static int _aac_reset_adapter(struct aac_dev *aac, int forced) static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
{ {
int index, quirks; int index, quirks;
int retval; int retval;
...@@ -1464,6 +1464,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced) ...@@ -1464,6 +1464,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced)
struct scsi_cmnd *command; struct scsi_cmnd *command;
struct scsi_cmnd *command_list; struct scsi_cmnd *command_list;
int jafo = 0; int jafo = 0;
int bled;
/* /*
* Assumptions: * Assumptions:
...@@ -1488,7 +1489,8 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced) ...@@ -1488,7 +1489,8 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced)
* If a positive health, means in a known DEAD PANIC * If a positive health, means in a known DEAD PANIC
* state and the adapter could be reset to `try again'. * state and the adapter could be reset to `try again'.
*/ */
retval = aac_adapter_restart(aac, forced ? 0 : aac_adapter_check_health(aac)); bled = forced ? 0 : aac_adapter_check_health(aac);
retval = aac_adapter_restart(aac, bled, reset_type);
if (retval) if (retval)
goto out; goto out;
...@@ -1598,11 +1600,12 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced) ...@@ -1598,11 +1600,12 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced)
return retval; return retval;
} }
int aac_reset_adapter(struct aac_dev * aac, int forced) int aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
{ {
unsigned long flagv = 0; unsigned long flagv = 0;
int retval; int retval;
struct Scsi_Host * host; struct Scsi_Host * host;
int bled;
if (spin_trylock_irqsave(&aac->fib_lock, flagv) == 0) if (spin_trylock_irqsave(&aac->fib_lock, flagv) == 0)
return -EBUSY; return -EBUSY;
...@@ -1651,7 +1654,9 @@ int aac_reset_adapter(struct aac_dev * aac, int forced) ...@@ -1651,7 +1654,9 @@ int aac_reset_adapter(struct aac_dev * aac, int forced)
if (forced < 2) if (forced < 2)
aac_send_shutdown(aac); aac_send_shutdown(aac);
spin_lock_irqsave(host->host_lock, flagv); spin_lock_irqsave(host->host_lock, flagv);
retval = _aac_reset_adapter(aac, forced ? forced : ((aac_check_reset != 0) && (aac_check_reset != 1))); bled = forced ? forced :
(aac_check_reset != 0 && aac_check_reset != 1);
retval = _aac_reset_adapter(aac, bled, reset_type);
spin_unlock_irqrestore(host->host_lock, flagv); spin_unlock_irqrestore(host->host_lock, flagv);
if ((forced < 2) && (retval == -ENODEV)) { if ((forced < 2) && (retval == -ENODEV)) {
...@@ -1697,6 +1702,7 @@ int aac_check_health(struct aac_dev * aac) ...@@ -1697,6 +1702,7 @@ int aac_check_health(struct aac_dev * aac)
unsigned long time_now, flagv = 0; unsigned long time_now, flagv = 0;
struct list_head * entry; struct list_head * entry;
struct Scsi_Host * host; struct Scsi_Host * host;
int bled;
/* Extending the scope of fib_lock slightly to protect aac->in_reset */ /* Extending the scope of fib_lock slightly to protect aac->in_reset */
if (spin_trylock_irqsave(&aac->fib_lock, flagv) == 0) if (spin_trylock_irqsave(&aac->fib_lock, flagv) == 0)
...@@ -1814,7 +1820,8 @@ int aac_check_health(struct aac_dev * aac) ...@@ -1814,7 +1820,8 @@ int aac_check_health(struct aac_dev * aac)
host = aac->scsi_host_ptr; host = aac->scsi_host_ptr;
if (aac->thread->pid != current->pid) if (aac->thread->pid != current->pid)
spin_lock_irqsave(host->host_lock, flagv); spin_lock_irqsave(host->host_lock, flagv);
BlinkLED = _aac_reset_adapter(aac, aac_check_reset != 1); bled = aac_check_reset != 1 ? 1 : 0;
_aac_reset_adapter(aac, bled, IOP_HWSOFT_RESET);
if (aac->thread->pid != current->pid) if (aac->thread->pid != current->pid)
spin_unlock_irqrestore(host->host_lock, flagv); spin_unlock_irqrestore(host->host_lock, flagv);
return BlinkLED; return BlinkLED;
......
...@@ -569,7 +569,7 @@ static ssize_t aac_show_unique_id(struct device *dev, ...@@ -569,7 +569,7 @@ static ssize_t aac_show_unique_id(struct device *dev,
memcpy(sn, aac->fsa_dev[sdev_id(sdev)].identifier, sizeof(sn)); memcpy(sn, aac->fsa_dev[sdev_id(sdev)].identifier, sizeof(sn));
return snprintf(buf, 16 * 2 + 2, return snprintf(buf, 16 * 2 + 2,
"%02X%02X%02X%02X%02X%02X%02X%02X %02X%02X%02X%02X%02X%02X%02X%02X\n", "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
sn[0], sn[1], sn[2], sn[3], sn[0], sn[1], sn[2], sn[3],
sn[4], sn[5], sn[6], sn[7], sn[4], sn[5], sn[6], sn[7],
sn[8], sn[9], sn[10], sn[11], sn[8], sn[9], sn[10], sn[11],
...@@ -899,7 +899,7 @@ static int aac_eh_reset(struct scsi_cmnd* cmd) ...@@ -899,7 +899,7 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
!(aac->supplement_adapter_info.SupportedOptions2 & !(aac->supplement_adapter_info.SupportedOptions2 &
AAC_OPTION_IGNORE_RESET))) { AAC_OPTION_IGNORE_RESET))) {
/* Bypass wait for command quiesce */ /* Bypass wait for command quiesce */
aac_reset_adapter(aac, 2); aac_reset_adapter(aac, 2, IOP_HWSOFT_RESET);
} }
ret = SUCCESS; ret = SUCCESS;
} }
...@@ -1167,10 +1167,16 @@ static ssize_t aac_store_reset_adapter(struct device *device, ...@@ -1167,10 +1167,16 @@ static ssize_t aac_store_reset_adapter(struct device *device,
const char *buf, size_t count) const char *buf, size_t count)
{ {
int retval = -EACCES; int retval = -EACCES;
int bled = 0;
struct aac_dev *aac;
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return retval; return retval;
retval = aac_reset_adapter((struct aac_dev*)class_to_shost(device)->hostdata, buf[0] == '!');
aac = (struct aac_dev *)class_to_shost(device)->hostdata;
bled = buf[0] == '!' ? 1:0;
retval = aac_reset_adapter(aac, bled, IOP_HWSOFT_RESET);
if (retval >= 0) if (retval >= 0)
retval = count; retval = count;
return retval; return retval;
......
...@@ -470,7 +470,7 @@ static int aac_rx_ioremap(struct aac_dev * dev, u32 size) ...@@ -470,7 +470,7 @@ static int aac_rx_ioremap(struct aac_dev * dev, u32 size)
return 0; return 0;
} }
static int aac_rx_restart_adapter(struct aac_dev *dev, int bled) static int aac_rx_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
{ {
u32 var = 0; u32 var = 0;
...@@ -559,7 +559,7 @@ int _aac_rx_init(struct aac_dev *dev) ...@@ -559,7 +559,7 @@ int _aac_rx_init(struct aac_dev *dev)
dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt; dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt;
dev->OIMR = status = rx_readb (dev, MUnit.OIMR); dev->OIMR = status = rx_readb (dev, MUnit.OIMR);
if ((((status & 0x0c) != 0x0c) || aac_reset_devices || reset_devices) && if ((((status & 0x0c) != 0x0c) || aac_reset_devices || reset_devices) &&
!aac_rx_restart_adapter(dev, 0)) !aac_rx_restart_adapter(dev, 0, IOP_HWSOFT_RESET))
/* Make sure the Hardware FIFO is empty */ /* Make sure the Hardware FIFO is empty */
while ((++restart < 512) && while ((++restart < 512) &&
(rx_readl(dev, MUnit.OutboundQueue) != 0xFFFFFFFFL)); (rx_readl(dev, MUnit.OutboundQueue) != 0xFFFFFFFFL));
...@@ -568,7 +568,8 @@ int _aac_rx_init(struct aac_dev *dev) ...@@ -568,7 +568,8 @@ int _aac_rx_init(struct aac_dev *dev)
*/ */
status = rx_readl(dev, MUnit.OMRx[0]); status = rx_readl(dev, MUnit.OMRx[0]);
if (status & KERNEL_PANIC) { if (status & KERNEL_PANIC) {
if (aac_rx_restart_adapter(dev, aac_rx_check_health(dev))) if (aac_rx_restart_adapter(dev,
aac_rx_check_health(dev), IOP_HWSOFT_RESET))
goto error_iounmap; goto error_iounmap;
++restart; ++restart;
} }
...@@ -606,7 +607,8 @@ int _aac_rx_init(struct aac_dev *dev) ...@@ -606,7 +607,8 @@ int _aac_rx_init(struct aac_dev *dev)
((startup_timeout > 60) ((startup_timeout > 60)
? (startup_timeout - 60) ? (startup_timeout - 60)
: (startup_timeout / 2))))) { : (startup_timeout / 2))))) {
if (likely(!aac_rx_restart_adapter(dev, aac_rx_check_health(dev)))) if (likely(!aac_rx_restart_adapter(dev,
aac_rx_check_health(dev), IOP_HWSOFT_RESET)))
start = jiffies; start = jiffies;
++restart; ++restart;
} }
......
...@@ -257,7 +257,7 @@ static void aac_sa_start_adapter(struct aac_dev *dev) ...@@ -257,7 +257,7 @@ static void aac_sa_start_adapter(struct aac_dev *dev)
NULL, NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL, NULL);
} }
static int aac_sa_restart_adapter(struct aac_dev *dev, int bled) static int aac_sa_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
{ {
return -EINVAL; return -EINVAL;
} }
......
...@@ -656,44 +656,100 @@ static int aac_srcv_ioremap(struct aac_dev *dev, u32 size) ...@@ -656,44 +656,100 @@ static int aac_srcv_ioremap(struct aac_dev *dev, u32 size)
return 0; return 0;
} }
static int aac_src_restart_adapter(struct aac_dev *dev, int bled) static void aac_set_intx_mode(struct aac_dev *dev)
{
if (dev->msi_enabled) {
aac_src_access_devreg(dev, AAC_ENABLE_INTX);
dev->msi_enabled = 0;
msleep(5000); /* Delay 5 seconds */
}
}
static void aac_send_iop_reset(struct aac_dev *dev, int bled)
{ {
u32 var, reset_mask; u32 var, reset_mask;
if (bled >= 0) { bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
if (bled) 0, 0, 0, 0, 0, 0, &var,
printk(KERN_ERR "%s%d: adapter kernel panic'd %x.\n", &reset_mask, NULL, NULL, NULL);
if ((bled || var != 0x00000001) && !dev->doorbell_mask)
bled = -EINVAL;
else if (dev->doorbell_mask) {
reset_mask = dev->doorbell_mask;
bled = 0;
var = 0x00000001;
}
aac_set_intx_mode(dev);
if (!bled && (dev->supplement_adapter_info.SupportedOptions2 &
AAC_OPTION_DOORBELL_RESET)) {
src_writel(dev, MUnit.IDR, reset_mask);
} else {
src_writel(dev, MUnit.IDR, 0x100);
}
msleep(30000);
}
static void aac_send_hardware_soft_reset(struct aac_dev *dev)
{
u_int32_t val;
val = readl(((char *)(dev->base) + IBW_SWR_OFFSET));
val |= 0x01;
writel(val, ((char *)(dev->base) + IBW_SWR_OFFSET));
msleep_interruptible(20000);
}
static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
{
unsigned long status, start;
if (bled < 0)
goto invalid_out;
if (bled)
pr_err("%s%d: adapter kernel panic'd %x.\n",
dev->name, dev->id, bled); dev->name, dev->id, bled);
dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
0, 0, 0, 0, 0, 0, &var, &reset_mask, NULL, NULL, NULL);
if ((bled || (var != 0x00000001)) &&
!dev->doorbell_mask)
return -EINVAL;
else if (dev->doorbell_mask) {
reset_mask = dev->doorbell_mask;
bled = 0;
var = 0x00000001;
}
if ((dev->pdev->device == PMC_DEVICE_S7 || dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
dev->pdev->device == PMC_DEVICE_S8 ||
dev->pdev->device == PMC_DEVICE_S9) && dev->msi_enabled) {
aac_src_access_devreg(dev, AAC_ENABLE_INTX);
dev->msi_enabled = 0;
msleep(5000); /* Delay 5 seconds */
}
if (!bled && (dev->supplement_adapter_info.SupportedOptions2 & switch (reset_type) {
AAC_OPTION_DOORBELL_RESET)) { case IOP_HWSOFT_RESET:
src_writel(dev, MUnit.IDR, reset_mask); aac_send_iop_reset(dev, bled);
ssleep(45); /*
} else { * Check to see if KERNEL_UP_AND_RUNNING
src_writel(dev, MUnit.IDR, 0x100); * Wait for the adapter to be up and running.
ssleep(45); * If !KERNEL_UP_AND_RUNNING issue HW Soft Reset
*/
status = src_readl(dev, MUnit.OMR);
if (dev->sa_firmware
&& !(status & KERNEL_UP_AND_RUNNING)) {
start = jiffies;
do {
status = src_readl(dev, MUnit.OMR);
if (time_after(jiffies,
start+HZ*SOFT_RESET_TIME)) {
aac_send_hardware_soft_reset(dev);
start = jiffies;
}
} while (!(status & KERNEL_UP_AND_RUNNING));
} }
break;
case HW_SOFT_RESET:
if (dev->sa_firmware) {
aac_send_hardware_soft_reset(dev);
aac_set_intx_mode(dev);
}
break;
default:
aac_send_iop_reset(dev, bled);
break;
} }
invalid_out:
if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC) if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
return -ENODEV; return -ENODEV;
...@@ -748,14 +804,15 @@ int aac_src_init(struct aac_dev *dev) ...@@ -748,14 +804,15 @@ int aac_src_init(struct aac_dev *dev)
dev->a_ops.adapter_sync_cmd = src_sync_cmd; dev->a_ops.adapter_sync_cmd = src_sync_cmd;
dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
if ((aac_reset_devices || reset_devices) && if ((aac_reset_devices || reset_devices) &&
!aac_src_restart_adapter(dev, 0)) !aac_src_restart_adapter(dev, 0, IOP_HWSOFT_RESET))
++restart; ++restart;
/* /*
* Check to see if the board panic'd while booting. * Check to see if the board panic'd while booting.
*/ */
status = src_readl(dev, MUnit.OMR); status = src_readl(dev, MUnit.OMR);
if (status & KERNEL_PANIC) { if (status & KERNEL_PANIC) {
if (aac_src_restart_adapter(dev, aac_src_check_health(dev))) if (aac_src_restart_adapter(dev,
aac_src_check_health(dev), IOP_HWSOFT_RESET))
goto error_iounmap; goto error_iounmap;
++restart; ++restart;
} }
...@@ -796,7 +853,7 @@ int aac_src_init(struct aac_dev *dev) ...@@ -796,7 +853,7 @@ int aac_src_init(struct aac_dev *dev)
? (startup_timeout - 60) ? (startup_timeout - 60)
: (startup_timeout / 2))))) { : (startup_timeout / 2))))) {
if (likely(!aac_src_restart_adapter(dev, if (likely(!aac_src_restart_adapter(dev,
aac_src_check_health(dev)))) aac_src_check_health(dev), IOP_HWSOFT_RESET)))
start = jiffies; start = jiffies;
++restart; ++restart;
} }
...@@ -893,7 +950,7 @@ int aac_srcv_init(struct aac_dev *dev) ...@@ -893,7 +950,7 @@ int aac_srcv_init(struct aac_dev *dev)
dev->a_ops.adapter_sync_cmd = src_sync_cmd; dev->a_ops.adapter_sync_cmd = src_sync_cmd;
dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
if ((aac_reset_devices || reset_devices) && if ((aac_reset_devices || reset_devices) &&
!aac_src_restart_adapter(dev, 0)) !aac_src_restart_adapter(dev, 0, IOP_HWSOFT_RESET))
++restart; ++restart;
/* /*
* Check to see if flash update is running. * Check to see if flash update is running.
...@@ -922,7 +979,8 @@ int aac_srcv_init(struct aac_dev *dev) ...@@ -922,7 +979,8 @@ int aac_srcv_init(struct aac_dev *dev)
*/ */
status = src_readl(dev, MUnit.OMR); status = src_readl(dev, MUnit.OMR);
if (status & KERNEL_PANIC) { if (status & KERNEL_PANIC) {
if (aac_src_restart_adapter(dev, aac_src_check_health(dev))) if (aac_src_restart_adapter(dev,
aac_src_check_health(dev), IOP_HWSOFT_RESET))
goto error_iounmap; goto error_iounmap;
++restart; ++restart;
} }
...@@ -961,7 +1019,8 @@ int aac_srcv_init(struct aac_dev *dev) ...@@ -961,7 +1019,8 @@ int aac_srcv_init(struct aac_dev *dev)
((startup_timeout > 60) ((startup_timeout > 60)
? (startup_timeout - 60) ? (startup_timeout - 60)
: (startup_timeout / 2))))) { : (startup_timeout / 2))))) {
if (likely(!aac_src_restart_adapter(dev, aac_src_check_health(dev)))) if (likely(!aac_src_restart_adapter(dev,
aac_src_check_health(dev), IOP_HWSOFT_RESET)))
start = jiffies; start = jiffies;
++restart; ++restart;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment