Lines Matching refs:card
18 typedef void (*creg_cmd_cb)(struct rsxx_cardinfo *card,
47 static int copy_to_creg_data(struct rsxx_cardinfo *card,
55 if (unlikely(card->eeh_state))
64 iowrite32be(data[i], card->regmap + CREG_DATA(i));
66 iowrite32(data[i], card->regmap + CREG_DATA(i));
73 static int copy_from_creg_data(struct rsxx_cardinfo *card,
81 if (unlikely(card->eeh_state))
90 data[i] = ioread32be(card->regmap + CREG_DATA(i));
92 data[i] = ioread32(card->regmap + CREG_DATA(i));
98 static void creg_issue_cmd(struct rsxx_cardinfo *card, struct creg_cmd *cmd)
102 if (unlikely(card->eeh_state))
105 iowrite32(cmd->addr, card->regmap + CREG_ADD);
106 iowrite32(cmd->cnt8, card->regmap + CREG_CNT);
110 st = copy_to_creg_data(card, cmd->cnt8,
117 if (unlikely(card->eeh_state))
121 iowrite32(cmd->op, card->regmap + CREG_CMD);
124 static void creg_kick_queue(struct rsxx_cardinfo *card)
126 if (card->creg_ctrl.active || list_empty(&card->creg_ctrl.queue))
129 card->creg_ctrl.active = 1;
130 card->creg_ctrl.active_cmd = list_first_entry(&card->creg_ctrl.queue,
132 list_del(&card->creg_ctrl.active_cmd->list);
133 card->creg_ctrl.q_depth--;
141 mod_timer(&card->creg_ctrl.cmd_timer,
144 creg_issue_cmd(card, card->creg_ctrl.active_cmd);
147 static int creg_queue_cmd(struct rsxx_cardinfo *card,
159 if (unlikely(card->halt))
162 if (card->creg_ctrl.reset)
183 spin_lock_bh(&card->creg_ctrl.lock);
184 list_add_tail(&cmd->list, &card->creg_ctrl.queue);
185 card->creg_ctrl.q_depth++;
186 creg_kick_queue(card);
187 spin_unlock_bh(&card->creg_ctrl.lock);
194 struct rsxx_cardinfo *card = from_timer(card, t, creg_ctrl.cmd_timer);
197 spin_lock(&card->creg_ctrl.lock);
198 cmd = card->creg_ctrl.active_cmd;
199 card->creg_ctrl.active_cmd = NULL;
200 spin_unlock(&card->creg_ctrl.lock);
203 card->creg_ctrl.creg_stats.creg_timeout++;
204 dev_warn(CARD_TO_DEV(card),
210 cmd->cb(card, cmd, -ETIMEDOUT);
215 spin_lock(&card->creg_ctrl.lock);
216 card->creg_ctrl.active = 0;
217 creg_kick_queue(card);
218 spin_unlock(&card->creg_ctrl.lock);
224 struct rsxx_cardinfo *card;
228 card = container_of(work, struct rsxx_cardinfo,
235 if (del_timer_sync(&card->creg_ctrl.cmd_timer) == 0)
236 card->creg_ctrl.creg_stats.failed_cancel_timer++;
238 spin_lock_bh(&card->creg_ctrl.lock);
239 cmd = card->creg_ctrl.active_cmd;
240 card->creg_ctrl.active_cmd = NULL;
241 spin_unlock_bh(&card->creg_ctrl.lock);
244 dev_err(CARD_TO_DEV(card),
249 card->creg_ctrl.creg_stats.stat = ioread32(card->regmap + CREG_STAT);
250 cmd->status = card->creg_ctrl.creg_stats.stat;
252 dev_err(CARD_TO_DEV(card),
266 unsigned int cnt8 = ioread32(card->regmap + CREG_CNT);
270 dev_err(CARD_TO_DEV(card),
276 dev_err(CARD_TO_DEV(card),
282 st = copy_from_creg_data(card, cnt8, cmd->buf, cmd->stream);
287 cmd->cb(card, cmd, st);
291 spin_lock_bh(&card->creg_ctrl.lock);
292 card->creg_ctrl.active = 0;
293 creg_kick_queue(card);
294 spin_unlock_bh(&card->creg_ctrl.lock);
297 static void creg_reset(struct rsxx_cardinfo *card)
307 if (!mutex_trylock(&card->creg_ctrl.reset_lock))
310 card->creg_ctrl.reset = 1;
311 spin_lock_irqsave(&card->irq_lock, flags);
312 rsxx_disable_ier_and_isr(card, CR_INTR_CREG | CR_INTR_EVENT);
313 spin_unlock_irqrestore(&card->irq_lock, flags);
315 dev_warn(CARD_TO_DEV(card),
319 spin_lock_bh(&card->creg_ctrl.lock);
320 list_for_each_entry_safe(cmd, tmp, &card->creg_ctrl.queue, list) {
322 card->creg_ctrl.q_depth--;
324 cmd->cb(card, cmd, -ECANCELED);
328 cmd = card->creg_ctrl.active_cmd;
329 card->creg_ctrl.active_cmd = NULL;
331 if (timer_pending(&card->creg_ctrl.cmd_timer))
332 del_timer_sync(&card->creg_ctrl.cmd_timer);
335 cmd->cb(card, cmd, -ECANCELED);
338 card->creg_ctrl.active = 0;
340 spin_unlock_bh(&card->creg_ctrl.lock);
342 card->creg_ctrl.reset = 0;
343 spin_lock_irqsave(&card->irq_lock, flags);
344 rsxx_enable_ier_and_isr(card, CR_INTR_CREG | CR_INTR_EVENT);
345 spin_unlock_irqrestore(&card->irq_lock, flags);
347 mutex_unlock(&card->creg_ctrl.reset_lock);
357 static void creg_cmd_done_cb(struct rsxx_cardinfo *card,
371 static int __issue_creg_rw(struct rsxx_cardinfo *card,
388 st = creg_queue_cmd(card, op, addr, cnt8, buf, stream, creg_cmd_done_cb,
399 card->creg_ctrl.q_depth + 20000);
411 dev_crit(CARD_TO_DEV(card),
413 creg_reset(card);
427 ioread32(card->regmap + SCRATCH);
429 dev_warn(CARD_TO_DEV(card),
438 static int issue_creg_rw(struct rsxx_cardinfo *card,
455 st = __issue_creg_rw(card, op, addr, xfer,
469 int rsxx_creg_write(struct rsxx_cardinfo *card,
475 return issue_creg_rw(card, addr, size8, data, byte_stream, 0);
478 int rsxx_creg_read(struct rsxx_cardinfo *card,
484 return issue_creg_rw(card, addr, size8, data, byte_stream, 1);
487 int rsxx_get_card_state(struct rsxx_cardinfo *card, unsigned int *state)
489 return rsxx_creg_read(card, CREG_ADD_CARD_STATE,
493 int rsxx_get_card_size8(struct rsxx_cardinfo *card, u64 *size8)
498 st = rsxx_creg_read(card, CREG_ADD_CARD_SIZE,
507 int rsxx_get_num_targets(struct rsxx_cardinfo *card,
510 return rsxx_creg_read(card, CREG_ADD_NUM_TARGETS,
514 int rsxx_get_card_capabilities(struct rsxx_cardinfo *card,
517 return rsxx_creg_read(card, CREG_ADD_CAPABILITIES,
521 int rsxx_issue_card_cmd(struct rsxx_cardinfo *card, u32 cmd)
523 return rsxx_creg_write(card, CREG_ADD_CARD_CMD,
529 static void hw_log_msg(struct rsxx_cardinfo *card, const char *str, int len)
545 dev_emerg(CARD_TO_DEV(card), "HW: %.*s", len, str);
548 dev_alert(CARD_TO_DEV(card), "HW: %.*s", len, str);
551 dev_crit(CARD_TO_DEV(card), "HW: %.*s", len, str);
554 dev_err(CARD_TO_DEV(card), "HW: %.*s", len, str);
557 dev_warn(CARD_TO_DEV(card), "HW: %.*s", len, str);
560 dev_notice(CARD_TO_DEV(card), "HW: %.*s", len, str);
563 dev_info(CARD_TO_DEV(card), "HW: %.*s", len, str);
566 dev_dbg(CARD_TO_DEV(card), "HW: %.*s", len, str);
569 dev_info(CARD_TO_DEV(card), "HW: %.*s", len, str);
595 static void read_hw_log_done(struct rsxx_cardinfo *card,
613 log_str = &card->log.buf[card->log.buf_len];
614 cnt = min(cmd->cnt8 - off, LOG_BUF_SIZE8 - card->log.buf_len);
618 card->log.buf_len += len;
625 (card->log.buf_len == LOG_BUF_SIZE8)) {
626 if (card->log.buf_len != 1) /* Don't log blank lines. */
627 hw_log_msg(card, card->log.buf,
628 card->log.buf_len);
629 card->log.buf_len = 0;
635 rsxx_read_hw_log(card);
638 int rsxx_read_hw_log(struct rsxx_cardinfo *card)
642 st = creg_queue_cmd(card, CREG_OP_READ, CREG_ADD_LOG,
643 sizeof(card->log.tmp), card->log.tmp,
646 dev_err(CARD_TO_DEV(card),
653 static int issue_reg_cmd(struct rsxx_cardinfo *card,
659 return __issue_creg_rw(card, op, cmd->addr, cmd->cnt, cmd->data,
663 int rsxx_reg_access(struct rsxx_cardinfo *card,
677 st = issue_reg_cmd(card, &cmd, read);
694 void rsxx_eeh_save_issued_creg(struct rsxx_cardinfo *card)
698 cmd = card->creg_ctrl.active_cmd;
699 card->creg_ctrl.active_cmd = NULL;
702 del_timer_sync(&card->creg_ctrl.cmd_timer);
704 spin_lock_bh(&card->creg_ctrl.lock);
705 list_add(&cmd->list, &card->creg_ctrl.queue);
706 card->creg_ctrl.q_depth++;
707 card->creg_ctrl.active = 0;
708 spin_unlock_bh(&card->creg_ctrl.lock);
712 void rsxx_kick_creg_queue(struct rsxx_cardinfo *card)
714 spin_lock_bh(&card->creg_ctrl.lock);
715 if (!list_empty(&card->creg_ctrl.queue))
716 creg_kick_queue(card);
717 spin_unlock_bh(&card->creg_ctrl.lock);
721 int rsxx_creg_setup(struct rsxx_cardinfo *card)
723 card->creg_ctrl.active_cmd = NULL;
725 card->creg_ctrl.creg_wq =
727 if (!card->creg_ctrl.creg_wq)
730 INIT_WORK(&card->creg_ctrl.done_work, creg_cmd_done);
731 mutex_init(&card->creg_ctrl.reset_lock);
732 INIT_LIST_HEAD(&card->creg_ctrl.queue);
733 spin_lock_init(&card->creg_ctrl.lock);
734 timer_setup(&card->creg_ctrl.cmd_timer, creg_cmd_timed_out, 0);
739 void rsxx_creg_destroy(struct rsxx_cardinfo *card)
746 spin_lock_bh(&card->creg_ctrl.lock);
747 list_for_each_entry_safe(cmd, tmp, &card->creg_ctrl.queue, list) {
750 cmd->cb(card, cmd, -ECANCELED);
756 dev_info(CARD_TO_DEV(card),
759 cmd = card->creg_ctrl.active_cmd;
760 card->creg_ctrl.active_cmd = NULL;
762 if (timer_pending(&card->creg_ctrl.cmd_timer))
763 del_timer_sync(&card->creg_ctrl.cmd_timer);
766 cmd->cb(card, cmd, -ECANCELED);
767 dev_info(CARD_TO_DEV(card),
771 spin_unlock_bh(&card->creg_ctrl.lock);
773 cancel_work_sync(&card->creg_ctrl.done_work);