From dwery. Index: linux-2.6.16/drivers/scsi/libata-core.c =================================================================== --- linux-2.6.16.orig/drivers/scsi/libata-core.c +++ linux-2.6.16/drivers/scsi/libata-core.c @@ -4700,6 +4700,9 @@ int ata_device_add(struct ata_probe_ent ap->ioaddr.bmdma_addr, ent->irq); + if (!ent->irq) + printk(KERN_INFO "ata%u: polling mode\n", ap->id); + ata_chk_status(ap); /* This last call probably should be conditional on bmdma */ host_set->ops->irq_clear(ap); @@ -4710,7 +4713,8 @@ int ata_device_add(struct ata_probe_ent goto err_free_ret; /* obtain irq, that is shared between channels */ - if (request_irq(ent->irq, ent->port_ops->irq_handler, ent->irq_flags, + if (ent->irq) + if (request_irq(ent->irq, ent->port_ops->irq_handler, ent->irq_flags, DRV_NAME, host_set)) goto err_out; @@ -4793,7 +4797,8 @@ void ata_host_set_remove(struct ata_host scsi_remove_host(ap->host); } - free_irq(host_set->irq, host_set); + if (host_set->irq) + free_irq(host_set->irq, host_set); for (i = 0; i < host_set->n_ports; i++) { ap = host_set->ports[i];