DF-4692 / fix.diff
--- a/sys/dev/disk/sili/sili_pm.c +++ b/sys/dev/disk/sili/sili_pm.c @@ -546,6 +546,11 @@ sili_pm_set_feature(struct sili_port *ap, int feature, int enable) struct ata_xfer *xa; int error; xa = sili_ata_get_xfer(ap, &ap->ap_ata[15]); + if (xa == NULL) { + kprintf("%s: PM set_feature failed, no free ccbs\n", + PORTNAME(ap)); + return (EBUSY); + } xa->fis->type = ATA_FIS_TYPE_H2D; xa->fis->flags = ATA_H2D_FLAGS_CMD | 15; @@ -640,6 +645,12 @@ sili_pm_read(struct sili_port *ap, int target, int which, u_int32_t *datap) struct ata_xfer *xa; int error; xa = sili_ata_get_xfer(ap, &ap->ap_ata[15]); + if (xa == NULL) { + kprintf("%s.%d pm_read SCA[%d] failed, no free ccbs\n", + PORTNAME(ap), target, which); + *datap = 0; + return (EBUSY); + } xa->fis->type = ATA_FIS_TYPE_H2D; xa->fis->command = ATA_C_READ_PM; @@ -677,6 +688,12 @@ sili_pm_write(struct sili_port *ap, int target, int which, u_int32_t data) struct ata_xfer *xa; int error; xa = sili_ata_get_xfer(ap, &ap->ap_ata[15]); + if (xa == NULL) { + kprintf("%s.%d pm_write SCA[%d] failed, no free ccbs\n", + PORTNAME(ap), target, which); + return (EBUSY); + } xa->fis->type = ATA_FIS_TYPE_H2D; xa->fis->command = ATA_C_WRITE_PM; |