@@ -4198,7 +4198,7 @@ static irqreturn_t pmcraid_isr_msix(int irq, void *dev_id)
}
}
- tasklet_schedule(&(pinstance->isr_tasklet[hrrq_id]));
+ tasklet_schedule(&(pinstance->isr_tasklet[hrrq_id]).tasklet);
return IRQ_HANDLED;
}
@@ -4267,7 +4267,7 @@ static irqreturn_t pmcraid_isr(int irq, void *dev_id)
pinstance->int_regs.ioa_host_interrupt_clr_reg);
tasklet_schedule(
- &(pinstance->isr_tasklet[hrrq_id]));
+ &(pinstance->isr_tasklet[hrrq_id].tasklet));
}
}
@@ -4380,20 +4380,20 @@ static void pmcraid_worker_function(struct work_struct *workp)
* Return Value
* None
*/
-static void pmcraid_tasklet_function(unsigned long instance)
+static void pmcraid_tasklet_function(struct tasklet_struct *t)
{
- struct pmcraid_isr_param *hrrq_vector;
- struct pmcraid_instance *pinstance;
+ struct pmcraid_tsk_param *tsk_param = from_tasklet(tsk_param, t,
+ tasklet);
+ int id = tsk_param->isr_tasklet_id;
+ struct pmcraid_instance *pinstance = container_of(tsk_param,
+ typeof(*pinstance),
+ isr_tasklet[id]);
unsigned long hrrq_lock_flags;
unsigned long pending_lock_flags;
unsigned long host_lock_flags;
spinlock_t *lockp; /* hrrq buffer lock */
- int id;
u32 resp;
- hrrq_vector = (struct pmcraid_isr_param *)instance;
- pinstance = hrrq_vector->drv_inst;
- id = hrrq_vector->hrrq_id;
lockp = &(pinstance->hrrq_lock[id]);
/* loop through each of the commands responded by IOA. Each HRRQ buf is
@@ -4882,10 +4882,11 @@ static int pmcraid_allocate_config_buffers(struct pmcraid_instance *pinstance)
static void pmcraid_init_tasklets(struct pmcraid_instance *pinstance)
{
int i;
- for (i = 0; i < pinstance->num_hrrq; i++)
- tasklet_init(&pinstance->isr_tasklet[i],
- pmcraid_tasklet_function,
- (unsigned long)&pinstance->hrrq_vector[i]);
+ for (i = 0; i < pinstance->num_hrrq; i++) {
+ pinstance->isr_tasklet[i].isr_tasklet_id = i;
+ tasklet_setup(&pinstance->isr_tasklet[i].tasklet,
+ pmcraid_tasklet_function);
+ }
}
/**
@@ -4900,7 +4901,7 @@ static void pmcraid_kill_tasklets(struct pmcraid_instance *pinstance)
{
int i;
for (i = 0; i < pinstance->num_hrrq; i++)
- tasklet_kill(&pinstance->isr_tasklet[i]);
+ tasklet_kill(&pinstance->isr_tasklet[i].tasklet);
}
/**
@@ -617,6 +617,11 @@ struct pmcraid_isr_param {
u8 hrrq_id; /* hrrq entry index */
};
+/* Tasklet parameters (one for each enabled tasklet) */
+struct pmcraid_tsk_param {
+ struct tasklet_struct tasklet;
+ u8 isr_tasklet_id; /* isr_tasklet entry index */
+};
/* AEN message header sent as part of event data to applications */
struct pmcraid_aen_msg {
@@ -752,8 +757,8 @@ struct pmcraid_instance {
spinlock_t free_pool_lock; /* free pool lock */
spinlock_t pending_pool_lock; /* pending pool lock */
- /* Tasklet to handle deferred processing */
- struct tasklet_struct isr_tasklet[PMCRAID_NUM_MSIX_VECTORS];
+ /* Tasklet parameters and tasklets to handle deferred processing */
+ struct pmcraid_tsk_param isr_tasklet[PMCRAID_NUM_MSIX_VECTORS];
/* Work-queue (Shared) for deferred reset processing */
struct work_struct worker_q;