diff options
author | sos <sos@FreeBSD.org> | 1999-09-24 12:36:10 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 1999-09-24 12:36:10 +0000 |
commit | 36d865f2d955e749b37bb24679ce3de39b59a8c3 (patch) | |
tree | 7bed38dced19010026359f3a01d2af75ca0b997a /sys | |
parent | ab4110c3bc36756f3185550b4185293cead3c23a (diff) | |
download | FreeBSD-src-36d865f2d955e749b37bb24679ce3de39b59a8c3.zip FreeBSD-src-36d865f2d955e749b37bb24679ce3de39b59a8c3.tar.gz |
Fix timeout handeling and add retry counts.
Add HPT366 probe message (but no real support yet),
Add CDR support for several diffenrent blocktypes, also close
disk as a multisession CD.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ata/ata-all.c | 8 | ||||
-rw-r--r-- | sys/dev/ata/ata-disk.c | 16 | ||||
-rw-r--r-- | sys/dev/ata/ata-disk.h | 1 | ||||
-rw-r--r-- | sys/dev/ata/atapi-all.c | 17 | ||||
-rw-r--r-- | sys/dev/ata/atapi-all.h | 1 | ||||
-rw-r--r-- | sys/dev/ata/atapi-cd.c | 57 | ||||
-rw-r--r-- | sys/dev/ata/atapi-cd.h | 12 |
7 files changed, 75 insertions, 37 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c index 8a34476..8828414 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 4b7df5e..44b9b99 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 83747c2..7438a54 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 b2dcdab..a88db27 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 e87332e..490401b 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 32349c3..dc4e649 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: */ - 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; + 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 CDR_MODE2: + 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; + + 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 2df5767..dddd7fb 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; |