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.
This commit is contained in:
Søren Schmidt 1999-09-24 12:36:10 +00:00
parent 61452e405e
commit 27fceb7416
7 changed files with 77 additions and 39 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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;

View File

@ -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;