Date: Sat, 10 Mar 2001 13:51:33 -0700 From: Warner Losh <imp@harmony.village.org> To: sos@freebsd.org, mobile@freebsd.org Subject: iomega clik! Message-ID: <200103102051.f2AKpXI20839@harmony.village.org>
next in thread | raw e-mail | index | archive | help
I just got one of those cool pccard clik! drives. The ones with the
drive integrated into the card.
Turns out they don't grok the mode sense for page
ATAPI_REWRITEABLE_CAP_PAGE, nor the ejection prevention commands
(ATAPI_PREVENT_ALLOW). So we fake it.
These patches are loosely based on patches that Tetsuo Sakaguchi-san
<saka@ulis.ac.jp> posted in [bsd-nomads:14262] against 2.2.8 + PAO
wfd.c. I didn't see anything in the message to indicate if
Sakagushi-san is the athor of these patches, or if he was just passing
them along. If you commit this, please give credit something like:
Submitted by: imp based on earlier patches by Tetsuo Sakaguchi-san
<saka@ulis.ac.jp>
In addition, they fix a kernel panic when an atapi driver fails to
attach and is later detached. We do this by adding a check to see if
adp is non-NULL before using it in atapi_detach(). Maybe a better way
would be to clear the present bit in the parent bus, but I'm not sure
what the implications of doing that would be.
I don't have any atapi fd devices to test these patches with. I'm
fairly certain I didn't break anything, but am posting these here in
case I did.
Warner
Index: atapi-all.c
===================================================================
RCS file: /cache/ncvs/src/sys/dev/ata/atapi-all.c,v
retrieving revision 1.63
diff -u -r1.63 atapi-all.c
--- atapi-all.c 2001/02/12 08:34:07 1.63
+++ atapi-all.c 2001/03/10 18:43:13
@@ -121,6 +121,12 @@
void
atapi_detach(struct atapi_softc *atp)
{
+ /*
+ * atp will be NULL when the child failed to attach.
+ */
+ if (atp == NULL)
+ return;
+
switch (ATP_PARAM->device_type) {
#ifdef DEV_ATAPICD
case ATAPI_TYPE_CDROM:
Index: atapi-fd.c
===================================================================
RCS file: /cache/ncvs/src/sys/dev/ata/atapi-fd.c,v
retrieving revision 1.58
diff -u -r1.58 atapi-fd.c
--- atapi-fd.c 2001/03/06 09:42:46 1.58
+++ atapi-fd.c 2001/03/10 20:32:53
@@ -67,6 +67,7 @@
/* prototypes */
static int afd_sense(struct afd_softc *);
+static int afd_clik_sense(struct afd_softc *);
static void afd_describe(struct afd_softc *);
static int afd_partial_done(struct atapi_request *);
static int afd_done(struct atapi_request *);
@@ -93,13 +94,19 @@
fdp->atp = atp;
fdp->lun = ata_get_lun(&afd_lun_map);
+ if (!strncmp(ATA_PARAM(atp->controller, atp->unit)->model,
+ "IOMEGA Clik!", 12))
+ fdp->iomega_clik = 1;
+ else
+ fdp->iomega_clik = 0;
+
if (afd_sense(fdp)) {
free(fdp, M_AFD);
return -1;
}
- if (!strncmp(ATA_PARAM(fdp->atp->controller, fdp->atp->unit)->model,
- "IOMEGA ZIP", 10))
+ if (!strncmp(ATA_PARAM(atp->controller, atp->unit)->model,
+ "IOMEGA ZIP", 10))
fdp->transfersize = 64;
devstat_add_entry(&fdp->stats, "afd", fdp->lun, DEV_BSIZE,
@@ -131,7 +138,35 @@
free(fdp, M_AFD);
}
+/*
+ * The iomega clik, like other iomega, it a pain in the backside.
+ * It doesn't support the ATAPI_REWRITABLE_CAP_PAGE, so we have
+ * to fake it up. In addition, we have to kick the drive to make
+ * sure that it is something approaching sane. But test_ready
+ * appears to fail when a disk isn't inserted.
+ */
static int
+afd_clik_sense(struct afd_softc *fdp)
+{
+ atapi_test_ready(fdp->atp);
+
+ fdp->transfersize = 64;
+ fdp->header.wp = 0;
+ fdp->header.medium_type = MFD_CLIK;
+ fdp->cap.page_code = ATAPI_REWRITEABLE_CAP_PAGE;
+ fdp->cap.ps = 0;
+ fdp->cap.page_length = 0;
+ fdp->cap.transfer_rate = 500;
+ fdp->cap.heads = CLIK_HEADS;
+ fdp->cap.sectors = CLIK_SECTORS;
+ fdp->cap.sector_size = CLIK_SECTOR_SIZE;
+ fdp->cap.cylinders = CLIK_CYLS;
+ fdp->cap.motor_delay = 1;
+ fdp->cap.rpm = 3600;
+ return 0;
+}
+
+static int
afd_sense(struct afd_softc *fdp)
{
int8_t buffer[256];
@@ -140,6 +175,8 @@
0, 0, 0, 0, 0, 0, 0 };
int count, error = 0;
+ if (fdp->iomega_clik)
+ return (afd_clik_sense(fdp));
bzero(buffer, sizeof(buffer));
/* get drive capabilities, some drives needs this repeated */
for (count = 0 ; count < 5 ; count++) {
@@ -423,5 +460,8 @@
int8_t ccb[16] = { ATAPI_PREVENT_ALLOW, 0, 0, 0, lock,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ if (fdp->iomega_clik)
+ return 0;
+
return atapi_queue_cmd(fdp->atp, ccb, NULL, 0, 0,30, NULL, NULL);
}
Index: atapi-fd.h
===================================================================
RCS file: /cache/ncvs/src/sys/dev/ata/atapi-fd.h,v
retrieving revision 1.13
diff -u -r1.13 atapi-fd.h
--- atapi-fd.h 2001/01/10 19:19:47 1.13
+++ atapi-fd.h 2001/03/10 19:39:34
@@ -39,6 +39,7 @@
#define MFD_HD_12 0x23
#define MFD_HD_144 0x24
#define MFD_UHD 0x31
+#define MFD_CLIK 0xfe /* Fake clik type */
#define MFD_UNKNOWN 0x00
#define MFD_NO_DISC 0x70
@@ -70,6 +71,12 @@
u_int8_t reserved30[2];
};
+/* IOMEGA Clik parameters */
+#define CLIK_SECTOR_SIZE 512
+#define CLIK_CYLS 39441
+#define CLIK_SECTORS 2
+#define CLIK_HEADS 1
+
struct afd_softc {
struct atapi_softc *atp; /* controller structure */
int lun; /* logical device unit */
@@ -80,5 +87,5 @@
struct disk disk; /* virtual drives */
struct devstat stats;
dev_t dev; /* device place holder */
+ int iomega_clik;
};
-
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-mobile" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200103102051.f2AKpXI20839>
