summaryrefslogtreecommitdiff
path: root/sys/dev/ata/atapi-all.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ata/atapi-all.c')
-rw-r--r--sys/dev/ata/atapi-all.c91
1 files changed, 50 insertions, 41 deletions
diff --git a/sys/dev/ata/atapi-all.c b/sys/dev/ata/atapi-all.c
index b8ee8ae7e5cd..8b034ff664e0 100644
--- a/sys/dev/ata/atapi-all.c
+++ b/sys/dev/ata/atapi-all.c
@@ -44,12 +44,12 @@
#include <dev/ata/atapi-all.h>
/* prototypes */
-static void atapi_read(struct atapi_request *, int32_t);
-static void atapi_write(struct atapi_request *, int32_t);
+static void atapi_read(struct atapi_request *, int);
+static void atapi_write(struct atapi_request *, int);
static void atapi_timeout(struct atapi_request *request);
-static int8_t *atapi_type(int32_t);
-static int8_t *atapi_cmd2str(u_int8_t);
-static int8_t *atapi_skey2str(u_int8_t);
+static char *atapi_type(int);
+static char *atapi_cmd2str(u_int8_t);
+static char *atapi_skey2str(u_int8_t);
/* internal vars */
MALLOC_DEFINE(M_ATAPI, "ATAPI generic", "ATAPI driver generic layer");
@@ -59,7 +59,7 @@ MALLOC_DEFINE(M_ATAPI, "ATAPI generic", "ATAPI driver generic layer");
#define ATP_PARAM ATA_PARAM(atp->controller, atp->unit)
void
-atapi_attach(struct ata_softc *scp, int32_t device)
+atapi_attach(struct ata_softc *scp, int device)
{
struct atapi_softc *atp;
@@ -88,7 +88,7 @@ atapi_attach(struct ata_softc *scp, int32_t device)
else
#endif
/* set PIO mode */
- ata_dmainit(atp->controller, atp->unit,
+ ata_dmainit(atp->controller, atp->unit,
ata_pmode(ATP_PARAM)<0 ? 0 : ata_pmode(ATP_PARAM), -1, -1);
switch (ATP_PARAM->device_type) {
@@ -147,13 +147,13 @@ atapi_detach(struct atapi_softc *atp)
free(atp, M_ATAPI);
}
-int32_t
-atapi_queue_cmd(struct atapi_softc *atp, int8_t *ccb, void *data,
- int32_t count, int32_t flags, int32_t timeout,
+int
+atapi_queue_cmd(struct atapi_softc *atp, int8_t *ccb, caddr_t data,
+ int count, int flags, int timeout,
atapi_callback_t callback, void *driver)
{
struct atapi_request *request;
- int32_t error, s;
+ int error, s;
if (!(request = malloc(sizeof(struct atapi_request), M_ATAPI, M_NOWAIT)))
return ENOMEM;
@@ -170,6 +170,10 @@ atapi_queue_cmd(struct atapi_softc *atp, int8_t *ccb, void *data,
request->callback = callback;
request->driver = driver;
}
+ if (atp->controller->mode[ATA_DEV(atp->unit)] >= ATA_DMA) {
+ if (!(request->dmatab = ata_dmaalloc(atp->controller, atp->unit)))
+ atp->controller->mode[ATA_DEV(atp->unit)] = ATA_PIO;
+ }
s = splbio();
@@ -203,6 +207,8 @@ atapi_queue_cmd(struct atapi_softc *atp, int8_t *ccb, void *data,
printf("%s: finished %s\n",
request->device->devname, atapi_cmd2str(request->ccb[0]));
#endif
+ if (request->dmatab)
+ free(request->dmatab, M_DEVBUF);
free(request, M_ATAPI);
return error;
}
@@ -235,8 +241,8 @@ void
atapi_transfer(struct atapi_request *request)
{
struct atapi_softc *atp = request->device;
- int32_t timout;
- int8_t reason;
+ int timout;
+ u_int8_t reason;
#ifdef ATAPI_DEBUG
printf("%s: starting %s ",
@@ -257,9 +263,8 @@ atapi_transfer(struct atapi_request *request)
((request->ccb[0] == ATAPI_WRITE ||
request->ccb[0] == ATAPI_WRITE_BIG) &&
!(atp->controller->flags & ATA_ATAPI_DMA_RO))) &&
- !ata_dmasetup(atp->controller, atp->unit,
- (void *)request->data, request->bytecount,
- request->flags & ATPR_F_READ)) {
+ !ata_dmasetup(atp->controller, atp->unit, request->dmatab,
+ (void *)request->data, request->bytecount)) {
request->flags |= ATPR_F_DMA_USED;
}
@@ -271,7 +276,8 @@ atapi_transfer(struct atapi_request *request)
printf("%s: failure to send ATAPI packet command\n", atp->devname);
if (request->flags & ATPR_F_DMA_USED)
- ata_dmastart(atp->controller);
+ ata_dmastart(atp->controller, atp->unit,
+ request->dmatab, request->flags & ATPR_F_READ);
/* command interrupt device ? just return */
if (ATP_PARAM->drqtype == ATAPI_DRQT_INTR)
@@ -301,12 +307,12 @@ atapi_transfer(struct atapi_request *request)
request->ccbsize / sizeof(int16_t));
}
-int32_t
+int
atapi_interrupt(struct atapi_request *request)
{
struct atapi_softc *atp = request->device;
int8_t **buffer = (int8_t **)&request->data;
- int32_t reason, dma_stat = 0;
+ int reason, dma_stat = 0;
if (request->ccb[0] == ATAPI_REQUEST_SENSE)
*buffer = (int8_t *)&request->sense;
@@ -338,8 +344,8 @@ atapi_interrupt(struct atapi_request *request)
}
}
else {
- int32_t length = inb(atp->controller->ioaddr + ATA_CYL_LSB) |
- inb(atp->controller->ioaddr + ATA_CYL_MSB) << 8;
+ int length = inb(atp->controller->ioaddr + ATA_CYL_LSB) |
+ inb(atp->controller->ioaddr + ATA_CYL_MSB) << 8;
switch (reason) {
case ATAPI_P_WRITE:
@@ -441,8 +447,11 @@ op_finished:
printf("%s: finished %s (callback)\n",
request->device->devname, atapi_cmd2str(request->ccb[0]));
#endif
- if (!((request->callback)(request)))
+ if (!((request->callback)(request))) {
+ if (request->dmatab)
+ free(request->dmatab, M_DEVBUF);
free(request, M_ATAPI);
+ }
}
else
wakeup((caddr_t)request);
@@ -462,11 +471,11 @@ atapi_reinit(struct atapi_softc *atp)
(ATP_PARAM->dmaflag ? 2 : 0) : ata_wmode(ATP_PARAM),
ata_umode(ATP_PARAM));
else
- ata_dmainit(atp->controller, atp->unit,
+ ata_dmainit(atp->controller, atp->unit,
ata_pmode(ATP_PARAM)<0 ? 0 : ata_pmode(ATP_PARAM), -1, -1);
}
-int32_t
+int
atapi_test_ready(struct atapi_softc *atp)
{
int8_t ccb[16] = { ATAPI_TEST_UNIT_READY, 0, 0, 0, 0,
@@ -475,10 +484,10 @@ atapi_test_ready(struct atapi_softc *atp)
return atapi_queue_cmd(atp, ccb, NULL, 0, 0, 30, NULL, NULL);
}
-int32_t
-atapi_wait_ready(struct atapi_softc *atp, int32_t timeout)
+int
+atapi_wait_ready(struct atapi_softc *atp, int timeout)
{
- int32_t error = 0, timout = timeout * hz;
+ int error = 0, timout = timeout * hz;
while (timout > 0) {
if ((error = atapi_test_ready(atp)) != EBUSY)
@@ -490,7 +499,7 @@ atapi_wait_ready(struct atapi_softc *atp, int32_t timeout)
}
void
-atapi_dump(int8_t *label, void *data, int32_t len)
+atapi_dump(char *label, void *data, int len)
{
u_int8_t *p = data;
@@ -501,11 +510,11 @@ atapi_dump(int8_t *label, void *data, int32_t len)
}
static void
-atapi_read(struct atapi_request *request, int32_t length)
+atapi_read(struct atapi_request *request, int length)
{
int8_t **buffer = (int8_t **)&request->data;
- int32_t size = min(request->bytecount, length);
- int32_t resid;
+ int size = min(request->bytecount, length);
+ int resid;
if (request->ccb[0] == ATAPI_REQUEST_SENSE)
*buffer = (int8_t *)&request->sense;
@@ -530,11 +539,11 @@ atapi_read(struct atapi_request *request, int32_t length)
}
static void
-atapi_write(struct atapi_request *request, int32_t length)
+atapi_write(struct atapi_request *request, int length)
{
int8_t **buffer = (int8_t **)&request->data;
- int32_t size = min(request->bytecount, length);
- int32_t resid;
+ int size = min(request->bytecount, length);
+ int resid;
if (request->ccb[0] == ATAPI_REQUEST_SENSE)
*buffer = (int8_t *)&request->sense;
@@ -562,7 +571,7 @@ static void
atapi_timeout(struct atapi_request *request)
{
struct atapi_softc *atp = request->device;
- int32_t s = splbio();
+ int s = splbio();
atp->controller->running = NULL;
printf("%s: %s command timeout - resetting\n",
@@ -571,7 +580,7 @@ atapi_timeout(struct atapi_request *request)
if (request->flags & ATPR_F_DMA_USED) {
ata_dmadone(atp->controller);
if (request->retries == ATAPI_MAX_RETRIES) {
- ata_dmainit(atp->controller, atp->unit,
+ ata_dmainit(atp->controller, atp->unit,
(ata_pmode(ATP_PARAM)<0)?0:ata_pmode(ATP_PARAM),-1,-1);
printf("%s: trying fallback to PIO mode\n", atp->devname);
request->retries = 0;
@@ -590,8 +599,8 @@ atapi_timeout(struct atapi_request *request)
splx(s);
}
-static int8_t *
-atapi_type(int32_t type)
+static char *
+atapi_type(int type)
{
switch (type) {
case ATAPI_TYPE_CDROM:
@@ -607,7 +616,7 @@ atapi_type(int32_t type)
}
}
-static int8_t *
+static char *
atapi_cmd2str(u_int8_t cmd)
{
switch (cmd) {
@@ -659,14 +668,14 @@ atapi_cmd2str(u_int8_t cmd)
case 0xbd: return ("MECH_STATUS");
case 0xbe: return ("READ_CD");
default: {
- static int8_t buffer[16];
+ static char buffer[16];
sprintf(buffer, "unknown CMD (0x%02x)", cmd);
return buffer;
}
}
}
-static int8_t *
+static char *
atapi_skey2str(u_int8_t skey)
{
switch (skey) {