diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c index 8a34476deb4..88284144135 100644 --- a/sys/dev/ata/ata-all.c +++ b/sys/dev/ata/ata-all.c @@ -202,6 +202,8 @@ ata_pcimatch(device_t dev) return "Promise Ultra/66 IDE controller"; case 0x522910b9: return "AcerLabs Aladdin IDE controller"; + case 0x00041103: + return "HighPoint HPT366 IDE controller"; case 0x05711106: /* 82c586 */ case 0x05961106: /* 82c596 */ return "VIA Apollo IDE controller (generic mode)"; @@ -623,10 +625,8 @@ ata_start(struct ata_softc *scp) } } } - if (!atapi_request) { - timeout((timeout_t*)ata_start, scp, 1); - return; - } + if (!atapi_request) + atapi_request = TAILQ_FIRST(&scp->atapi_queue); TAILQ_REMOVE(&scp->atapi_queue, atapi_request, chain); scp->active = ATA_ACTIVE_ATAPI; scp->running = atapi_request; diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c index 4b7df5e0f6d..44b9b99da36 100644 --- a/sys/dev/ata/ata-disk.c +++ b/sys/dev/ata/ata-disk.c @@ -96,6 +96,9 @@ static void ad_drvinit(void); static int32_t adnlun = 0; /* number of config'd drives */ static struct intr_config_hook *ad_attach_hook; +/* defines */ +#define AD_MAX_RETRIES 5 + static __inline int apiomode(struct ata_params *ap) { @@ -615,6 +618,19 @@ ad_timeout(struct ad_request *request) if (request->flags & AR_F_DMA_USED) ata_dmadone(adp->controller, adp->unit); + if (request->retries < AD_MAX_RETRIES) { + /* reinject this request */ + request->retries++; + TAILQ_INSERT_HEAD(&adp->controller->ata_queue, request, chain); + } + else { + /* retries all used up, return error */ + request->bp->b_error = EIO; + request->bp->b_flags |= B_ERROR; + devstat_end_transaction_buf(&adp->stats, request->bp); + biodone(request->bp); + free(request, M_DEVBUF); + } ata_reinit(adp->controller); } diff --git a/sys/dev/ata/ata-disk.h b/sys/dev/ata/ata-disk.h index 83747c2177b..7438a54d160 100644 --- a/sys/dev/ata/ata-disk.h +++ b/sys/dev/ata/ata-disk.h @@ -149,6 +149,7 @@ struct ad_request { u_int32_t donecount; /* bytes transferred */ u_int32_t currentsize; /* size of current transfer */ struct callout_handle timeout_handle; /* handle for untimeout */ + int32_t retries; /* retry count */ int32_t flags; #define AR_F_READ 0x0001 #define AR_F_ERROR 0x0002 diff --git a/sys/dev/ata/atapi-all.c b/sys/dev/ata/atapi-all.c index b2dcdab203c..a88db272b97 100644 --- a/sys/dev/ata/atapi-all.c +++ b/sys/dev/ata/atapi-all.c @@ -62,8 +62,12 @@ int32_t acdattach(struct atapi_softc *); int32_t afdattach(struct atapi_softc *); int32_t astattach(struct atapi_softc *); +/* internal vars */ static struct intr_config_hook *atapi_attach_hook; +/* defines */ +#define ATAPI_MAX_RETRIES 5 + static __inline int apiomode(struct atapi_params *ap) { @@ -401,7 +405,8 @@ atapi_interrupt(struct atapi_request *request) if (atapi_wait(atp, 0) < 0) { printf("atapi_interrupt: timeout waiting for status"); atp->flags &= ~ATAPI_F_DMA_USED; - request->result = inb(atp->controller->ioaddr + ATA_ERROR) | 0xf0; + request->result = inb(atp->controller->ioaddr + ATA_ERROR) | + ATAPI_SK_RESERVED; goto op_finished; } @@ -528,6 +533,16 @@ atapi_timeout(struct atapi_request *request) if (request->flags & ATAPI_F_DMA_USED) ata_dmadone(atp->controller, atp->unit); + if (request->retries < ATAPI_MAX_RETRIES) { + /* reinject this request */ + request->retries++; + TAILQ_INSERT_HEAD(&atp->controller->atapi_queue, request, chain); + } + else { + /* retries all used up, return error */ + request->result = ATAPI_SK_RESERVED | ATAPI_E_ABRT; + wakeup((caddr_t)request); + } ata_reinit(atp->controller); } diff --git a/sys/dev/ata/atapi-all.h b/sys/dev/ata/atapi-all.h index e87332e7d39..490401b889e 100644 --- a/sys/dev/ata/atapi-all.h +++ b/sys/dev/ata/atapi-all.h @@ -251,6 +251,7 @@ struct atapi_request { u_int32_t donecount; /* bytes transferred */ int32_t timeout; /* timeout for this cmd */ struct callout_handle timeout_handle; /* handle for untimeout */ + int32_t retries; /* retry count */ int32_t result; /* result of this cmd */ int32_t flags; #define A_READ 0x0001 diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c index 32349c30aed..dc4e649940f 100644 --- a/sys/dev/ata/atapi-cd.c +++ b/sys/dev/ata/atapi-cd.c @@ -941,7 +941,7 @@ acdioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, struct proc *p) cdp->dummy = w->dummy; } /* set speed in KB/s (approximate) */ - acd_set_speed(cdp, w->speed * 173); + acd_set_speed(cdp, w->speed * 177); } break; } @@ -1297,60 +1297,65 @@ acd_open_track(struct acd_softc *cdp, struct wormio_prepare_track *ptp) param.test_write = cdp->dummy ? 1 : 0; param.write_type = CDR_WTYPE_TRACK; - switch (ptp->audio) { -/* switch (data_type) { */ + switch (ptp->track_type) { - case 0: -/* case CDR_DATA: */ + case BLOCK_RAW: + if (ptp->preemp) + param.track_mode = CDR_TMODE_AUDIO; + else + param.track_mode = 0; + cdp->block_size = 2352; + param.data_block_type = CDR_DB_RAW; + param.session_format = CDR_SESS_CDROM; + break; + + case BLOCK_MODE_1: cdp->block_size = 2048; param.track_mode = CDR_TMODE_DATA; param.data_block_type = CDR_DB_ROM_MODE1; param.session_format = CDR_SESS_CDROM; break; - default: -/* case CDR_AUDIO: */ - cdp->block_size = 2352; - if (ptp->preemp) - param.track_mode = CDR_TMODE_AUDIO; - else - param.track_mode = 0; - param.data_block_type = CDR_DB_RAW; - param.session_format = CDR_SESS_CDROM; - break; - -/* - case CDR_MODE2: + case BLOCK_MODE_2: + cdp->block_size = 2336; param.track_mode = CDR_TMODE_DATA; param.data_block_type = CDR_DB_ROM_MODE2; param.session_format = CDR_SESS_CDROM; break; - case CDR_XA1: + case BLOCK_MODE_2_FORM_1: + cdp->block_size = 2048; param.track_mode = CDR_TMODE_DATA; param.data_block_type = CDR_DB_XA_MODE1; param.session_format = CDR_SESS_CDROM_XA; break; - case CDR_XA2: + case BLOCK_MODE_2_FORM_1b: + cdp->block_size = 2056; param.track_mode = CDR_TMODE_DATA; param.data_block_type = CDR_DB_XA_MODE2_F1; param.session_format = CDR_SESS_CDROM_XA; break; - case CDR_CDI: + case BLOCK_MODE_2_FORM_2: + cdp->block_size = 2324; param.track_mode = CDR_TMODE_DATA; - param.data_block_type = CDR_DB_XA_MODE2_F1; - param.session_format = CDR_SESS_CDI; + param.data_block_type = CDR_DB_XA_MODE2_F2; + param.session_format = CDR_SESS_CDROM_XA; + break; + + case BLOCK_MODE_2_FORM_2b: + cdp->block_size = 2332; + param.track_mode = CDR_TMODE_DATA; + param.data_block_type = CDR_DB_XA_MODE2_MIX; + param.session_format = CDR_SESS_CDROM_XA; break; } -*/ - } -#if 0 - param.multi_session = CDR_MSES_MULTI; +#if 1 + param.multi_session = CDR_MSES_MULTI; #else - param.multi_session = CDR_MSES_NONE; + param.multi_session = CDR_MSES_NONE; #endif param.fp = 0; param.packet_size = 0; diff --git a/sys/dev/ata/atapi-cd.h b/sys/dev/ata/atapi-cd.h index 2df5767d53f..dddd7fb6390 100644 --- a/sys/dev/ata/atapi-cd.h +++ b/sys/dev/ata/atapi-cd.h @@ -248,12 +248,12 @@ struct write_param { #define CDR_DB_VS_7 0x7 /* vendor specific */ #define CDR_DB_ROM_MODE1 0x8 /* 2048 bytes Mode 1 (ISO/IEC 10149) */ #define CDR_DB_ROM_MODE2 0x9 /* 2336 bytes Mode 2 (ISO/IEC 10149) */ -#define CDR_DB_XA_MODE1 0x10 /* 2048 bytes Mode 1 (CD-ROM XA 1) */ -#define CDR_DB_XA_MODE2_F1 0x11 /* 2056 bytes Mode 2 (CD-ROM XA 1) */ -#define CDR_DB_XA_MODE2_F2 0x12 /* 2324 bytes Mode 2 (CD-ROM XA 2) */ -#define CDR_DB_XA_MODE2_MIX 0x13 /* 2332 bytes Mode 2 (CD-ROM XA 1/2) */ -#define CDR_DB_RES_14 0x14 /* reserved */ -#define CDR_DB_VS_15 0x15 /* vendor specific */ +#define CDR_DB_XA_MODE1 0xa /* 2048 bytes Mode 1 (CD-ROM XA 1) */ +#define CDR_DB_XA_MODE2_F1 0xb /* 2056 bytes Mode 2 (CD-ROM XA 1) */ +#define CDR_DB_XA_MODE2_F2 0xc /* 2324 bytes Mode 2 (CD-ROM XA 2) */ +#define CDR_DB_XA_MODE2_MIX 0xd /* 2332 bytes Mode 2 (CD-ROM XA 1/2) */ +#define CDR_DB_RES_14 0xe /* reserved */ +#define CDR_DB_VS_15 0xf /* vendor specific */ u_int8_t reserved4_4567 :4; u_int8_t reserved5;