2 * ----------------------------------------------------------------------------
3 * "THE BEER-WARE LICENSE" (Revision 42):
4 * <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you
5 * can do whatever you want with this stuff. If we meet some day, and you think
6 * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
7 * ----------------------------------------------------------------------------
9 * $FreeBSD: src/sys/contrib/dev/fla/fla.c,v 1.16 1999/12/08 04:45:16 ken Exp $
10 * $DragonFly: src/sys/contrib/dev/fla/Attic/fla.c,v 1.3 2003/07/21 05:50:25 dillon Exp $
15 #include <sys/param.h>
16 #include <sys/systm.h>
17 #include <sys/sysctl.h>
18 #include <sys/kernel.h>
20 #include <sys/malloc.h>
23 #include <sys/devicestat.h>
24 #include <sys/module.h>
25 #include <machine/clock.h>
26 #include <machine/resource.h>
30 #include <vm/vm_param.h>
33 #include <isa/isavar.h>
36 #include <machine/smp.h>
37 #define LEAVE() rel_mplock();
38 #define ENTER() get_mplock();
44 #include <contrib/dev/fla/msysosak.h>
46 MALLOC_DEFINE(M_FLA, "fla driver", "fla driver storage");
48 static int fla_debug = 0;
49 SYSCTL_INT(_debug, OID_AUTO, fladebug, CTLFLAG_RW, &fla_debug, 0, "");
51 #define CDEV_MAJOR 102
54 static d_strategy_t flastrategy;
55 static d_open_t flaopen;
56 static d_close_t flaclose;
57 static d_ioctl_t flaioctl;
59 static struct cdevsw fla_cdevsw = {
62 /* flags */ D_DISK | D_CANFREE,
69 /* write */ physwrite,
73 /* strategy */ flastrategy,
77 static struct cdevsw fladisk_cdevsw;
80 doc2k_malloc(int bytes)
82 return malloc(bytes, M_FLA, M_WAITOK);
92 doc2k_delay(unsigned msec)
98 doc2k_memcpy(void *dst, const void *src, unsigned len)
100 bcopy(src, dst, len);
104 doc2k_memcmp(const void *dst, const void *src, unsigned len)
106 return (bcmp(src, dst, len));
110 doc2k_memset(void *dst, int c, unsigned len)
117 static struct fla_s {
121 struct doc2k_stat ds;
122 struct buf_queue_head buf_queue;
123 struct devstat stats;
129 flaopen(dev_t dev, int flag, int fmt, struct proc *p)
133 struct disklabel *dl;
136 printf("flaopen(%s %x %x %p)\n",
137 devtoname(dev), flag, fmt, p);
141 error = doc2k_open(sc->unit);
144 printf("doc2k_open(%d) -> err %d\n", sc->unit, error);
148 dl = &sc->disk.d_label;
149 bzero(dl, sizeof(*dl));
150 error = doc2k_size(sc->unit, &dl->d_secperunit,
151 &dl->d_ncylinders, &dl->d_ntracks, &dl->d_nsectors);
152 dl->d_secsize = DEV_BSIZE;
153 dl->d_secpercyl = dl->d_ntracks * dl->d_nsectors; /* XXX */
159 flaclose(dev_t dev, int flags, int fmt, struct proc *p)
165 printf("flaclose(%s %x %x %p)\n",
166 devtoname(dev), flags, fmt, p);
170 error = doc2k_close(sc->unit);
172 printf("doc2k_close(%d) -> err %d\n", sc->unit, error);
179 flaioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
183 printf("flaioctl(%s %lx %p %x %p)\n",
184 devtoname(dev), cmd, addr, flags, p);
190 flastrategy(struct buf *bp)
195 enum doc2k_work what;
198 printf("flastrategy(%p) %s %lx, %d, %ld, %p)\n",
199 bp, devtoname(bp->b_dev), bp->b_flags, bp->b_blkno,
200 bp->b_bcount / DEV_BSIZE, bp->b_data);
202 sc = bp->b_dev->si_drv1;
206 bufqdisksort(&sc->buf_queue, bp);
216 bp = bufq_first(&sc->buf_queue);
218 bufq_remove(&sc->buf_queue, bp);
223 devstat_start_transaction(&sc->stats);
224 bp->b_resid = bp->b_bcount;
225 unit = dkunit(bp->b_dev);
227 if (bp->b_flags & B_FREEBUF)
229 else if (bp->b_flags & B_READ)
236 error = doc2k_rwe( unit, what, bp->b_pblkno,
237 bp->b_bcount / DEV_BSIZE, bp->b_data);
241 if (fla_debug > 1 || error) {
242 printf("fla%d: %d = rwe(%p, %d, %d, %d, %ld, %p)\n",
243 unit, error, bp, unit, what, bp->b_pblkno,
244 bp->b_bcount / DEV_BSIZE, bp->b_data);
248 bp->b_flags |= B_ERROR;
252 devstat_end_transaction_buf(&sc->stats, bp);
262 flaprobe (device_t dev)
268 unit = device_get_unit(dev);
271 /* This is slightly ugly */
272 i = doc2k_probe(unit, KERNBASE + 0xc0000, KERNBASE + 0xe0000);
276 i = doc2k_info(unit, &sc->ds);
280 bus_set_resource(dev, SYS_RES_MEMORY, 0,
281 sc->ds.window - KERNBASE, 8192);
287 flaattach (device_t dev)
290 int i, j, k, l, m, error;
293 unit = device_get_unit(dev);
296 error = doc2k_open(unit);
298 printf("doc2k_open(%d) -> err %d\n", unit, error);
302 error = doc2k_size(unit, &sc->nsect, &i, &j, &k );
304 printf("doc2k_size(%d) -> err %d\n", unit, error);
308 printf("fla%d: <%s %s>\n", unit, sc->ds.product, sc->ds.model);
310 error = doc2k_close(unit);
312 printf("doc2k_close(%d) -> err %d\n", unit, error);
316 m = 1024L * 1024L / DEV_BSIZE;
317 l = (sc->nsect * 10 + m/2) / m;
318 printf("fla%d: %d.%01dMB (%u sectors),"
319 " %d cyls, %d heads, %d S/T, 512 B/S\n",
320 unit, l / 10, l % 10, sc->nsect, i, j, k);
323 printf("fla%d: JEDEC=0x%x unitsize=%ld mediasize=%ld"
324 " chipsize=%ld interleave=%d window=%lx\n",
325 unit, sc->ds.type, sc->ds.unitSize, sc->ds.mediaSize,
326 sc->ds.chipSize, sc->ds.interleaving, sc->ds.window);
328 bufq_init(&sc->buf_queue);
330 devstat_add_entry(&softc[unit].stats, "fla", unit, DEV_BSIZE,
331 DEVSTAT_NO_ORDERED_TAGS,
332 DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER,
333 DEVSTAT_PRIORITY_DISK);
335 sc->dev = disk_create(unit, &sc->disk, 0, &fla_cdevsw, &fladisk_cdevsw);
336 sc->dev->si_drv1 = sc;
342 static device_method_t fla_methods[] = {
343 /* Device interface */
344 DEVMETHOD(device_probe, flaprobe),
345 DEVMETHOD(device_attach, flaattach),
349 static driver_t fladriver = {
352 sizeof(struct fla_s),
355 static devclass_t fla_devclass;
357 DRIVER_MODULE(fla, isa, fladriver, fla_devclass, 0, 0);