Elias Oltmanns wrote:
> +static int piix_qc_defer(struct ata_queued_cmd *qc)
> +{
> + static struct ata_port *ap = NULL;
> + struct ata_queued_cmd qcmd[ATA_MAX_QUEUE];
missing static?
> + static int count = 0;
> +#define PIIX_QC_DEFER_THRESHOLD 5000
> +
> + if (!ap)
> + ap = qc->ap;
> + else if (ap != qc->ap)
> + return 0;
> +
> + if (count > PIIX_QC_DEFER_THRESHOLD + 100)
> + return 0;
> +
> + count++;
> + if (count < PIIX_QC_DEFER_THRESHOLD)
> + return 0;
> + else if (count == PIIX_QC_DEFER_THRESHOLD) {
> + int i;
> + if (ap->qc_allocated) {
> + for (i = 0; i < ATA_MAX_QUEUE; i++)
> + qcmd[i] = ap->qcmd[i];
> + printk(KERN_DEBUG "piix_qc_defer(): saved current
> state\n");
> + msleep(5000);
> + } else
> + count--;
> + } else if (count == PIIX_QC_DEFER_THRESHOLD + 100) {
> + dump_stack();
> + count++;
> + } else if (memcmp(qcmd, ap->qcmd, sizeof(qcmd[0]) * ATA_MAX_QUEUE))
memcmp() will always mismatch. qcmd contains garbage.
> + return ATA_DEFER_LINK;
> + else
> + count = 0;
> + return 0;
> +}
> +
> static const struct piix_map_db ich5_map_db = {
> .mask = 0x7,
> .port_enable = 0x3,
> ---
>
>
> ====================================================================
> Feb 11 20:33:05 denkblock kernel: piix_qc_defer(): saved current state
> Feb 11 20:33:11 denkblock kernel: BUG: scheduling while atomic:
> swapper/0/0x00000100
You can't call msleep(5000) there.
Thanks.
--
tejun
-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html