mlx_disk.c (9eee27f16dfdce60dfd13b7f7a0486a65a2686b5) | mlx_disk.c (da8bb3a3bf71a0579594e2faa0dd92b821689e12) |
---|---|
1/*- 2 * Copyright (c) 1999 Jonathan Lemon 3 * Copyright (c) 1999 Michael Smith 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 36 unchanged lines hidden (view full) --- 45#include <machine/bus.h> 46#include <machine/clock.h> 47#include <sys/rman.h> 48 49#include <dev/mlx/mlxio.h> 50#include <dev/mlx/mlxvar.h> 51#include <dev/mlx/mlxreg.h> 52 | 1/*- 2 * Copyright (c) 1999 Jonathan Lemon 3 * Copyright (c) 1999 Michael Smith 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 36 unchanged lines hidden (view full) --- 45#include <machine/bus.h> 46#include <machine/clock.h> 47#include <sys/rman.h> 48 49#include <dev/mlx/mlxio.h> 50#include <dev/mlx/mlxvar.h> 51#include <dev/mlx/mlxreg.h> 52 |
53#if 0 54#define debug(fmt, args...) printf("%s: " fmt "\n", __FUNCTION__ , ##args) 55#else 56#define debug(fmt, args...) 57#endif 58 | |
59/* prototypes */ 60static int mlxd_probe(device_t dev); 61static int mlxd_attach(device_t dev); 62static int mlxd_detach(device_t dev); 63 64static d_open_t mlxd_open; 65static d_close_t mlxd_close; 66static d_strategy_t mlxd_strategy; --- 39 unchanged lines hidden (view full) --- 106DRIVER_MODULE(mlxd, mlx, mlxd_driver, mlxd_devclass, 0, 0); 107 108static int 109mlxd_open(dev_t dev, int flags, int fmt, struct proc *p) 110{ 111 struct mlxd_softc *sc = (struct mlxd_softc *)dev->si_drv1; 112 struct disklabel *label; 113 | 53/* prototypes */ 54static int mlxd_probe(device_t dev); 55static int mlxd_attach(device_t dev); 56static int mlxd_detach(device_t dev); 57 58static d_open_t mlxd_open; 59static d_close_t mlxd_close; 60static d_strategy_t mlxd_strategy; --- 39 unchanged lines hidden (view full) --- 100DRIVER_MODULE(mlxd, mlx, mlxd_driver, mlxd_devclass, 0, 0); 101 102static int 103mlxd_open(dev_t dev, int flags, int fmt, struct proc *p) 104{ 105 struct mlxd_softc *sc = (struct mlxd_softc *)dev->si_drv1; 106 struct disklabel *label; 107 |
114 debug("called"); | 108 debug_called(1); |
115 116 if (sc == NULL) 117 return (ENXIO); 118 119 /* controller not active? */ 120 if (sc->mlxd_controller->mlx_state & MLX_STATE_SHUTDOWN) 121 return(ENXIO); 122 --- 11 unchanged lines hidden (view full) --- 134 return (0); 135} 136 137static int 138mlxd_close(dev_t dev, int flags, int fmt, struct proc *p) 139{ 140 struct mlxd_softc *sc = (struct mlxd_softc *)dev->si_drv1; 141 | 109 110 if (sc == NULL) 111 return (ENXIO); 112 113 /* controller not active? */ 114 if (sc->mlxd_controller->mlx_state & MLX_STATE_SHUTDOWN) 115 return(ENXIO); 116 --- 11 unchanged lines hidden (view full) --- 128 return (0); 129} 130 131static int 132mlxd_close(dev_t dev, int flags, int fmt, struct proc *p) 133{ 134 struct mlxd_softc *sc = (struct mlxd_softc *)dev->si_drv1; 135 |
142 debug("called"); | 136 debug_called(1); |
143 144 if (sc == NULL) 145 return (ENXIO); 146 sc->mlxd_flags &= ~MLXD_OPEN; 147 return (0); 148} 149 150static int 151mlxd_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, struct proc *p) 152{ 153 struct mlxd_softc *sc = (struct mlxd_softc *)dev->si_drv1; 154 int error; 155 | 137 138 if (sc == NULL) 139 return (ENXIO); 140 sc->mlxd_flags &= ~MLXD_OPEN; 141 return (0); 142} 143 144static int 145mlxd_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, struct proc *p) 146{ 147 struct mlxd_softc *sc = (struct mlxd_softc *)dev->si_drv1; 148 int error; 149 |
156 debug("called"); | 150 debug_called(1); |
157 158 if (sc == NULL) 159 return (ENXIO); 160 161 if ((error = mlx_submit_ioctl(sc->mlxd_controller, sc->mlxd_drive, cmd, addr, flag, p)) != ENOIOCTL) { | 151 152 if (sc == NULL) 153 return (ENXIO); 154 155 if ((error = mlx_submit_ioctl(sc->mlxd_controller, sc->mlxd_drive, cmd, addr, flag, p)) != ENOIOCTL) { |
162 debug("mlx_submit_ioctl returned %d\n", error); | 156 debug(0, "mlx_submit_ioctl returned %d\n", error); |
163 return(error); 164 } 165 return (ENOTTY); 166} 167 168/* 169 * Read/write routine for a buffer. Finds the proper unit, range checks 170 * arguments, and schedules the transfer. Does not wait for the transfer 171 * to complete. Multi-page transfers are supported. All I/O requests must 172 * be a multiple of a sector in length. 173 */ 174static void 175mlxd_strategy(struct buf *bp) 176{ 177 struct mlxd_softc *sc = (struct mlxd_softc *)bp->b_dev->si_drv1; 178 | 157 return(error); 158 } 159 return (ENOTTY); 160} 161 162/* 163 * Read/write routine for a buffer. Finds the proper unit, range checks 164 * arguments, and schedules the transfer. Does not wait for the transfer 165 * to complete. Multi-page transfers are supported. All I/O requests must 166 * be a multiple of a sector in length. 167 */ 168static void 169mlxd_strategy(struct buf *bp) 170{ 171 struct mlxd_softc *sc = (struct mlxd_softc *)bp->b_dev->si_drv1; 172 |
179 debug("called"); | 173 debug_called(1); |
180 181 /* bogus disk? */ 182 if (sc == NULL) { 183 bp->b_error = EINVAL; 184 goto bad; 185 } 186 187 /* XXX may only be temporarily offline - sleep? */ --- 23 unchanged lines hidden (view full) --- 211} 212 213void 214mlxd_intr(void *data) 215{ 216 struct buf *bp = (struct buf *)data; 217 struct mlxd_softc *sc = (struct mlxd_softc *)bp->b_dev->si_drv1; 218 | 174 175 /* bogus disk? */ 176 if (sc == NULL) { 177 bp->b_error = EINVAL; 178 goto bad; 179 } 180 181 /* XXX may only be temporarily offline - sleep? */ --- 23 unchanged lines hidden (view full) --- 205} 206 207void 208mlxd_intr(void *data) 209{ 210 struct buf *bp = (struct buf *)data; 211 struct mlxd_softc *sc = (struct mlxd_softc *)bp->b_dev->si_drv1; 212 |
219 debug("called"); | 213 debug_called(1); |
220 221 if (bp->b_flags & B_ERROR) 222 bp->b_error = EIO; 223 else 224 bp->b_resid = 0; 225 226 devstat_end_transaction_buf(&sc->mlxd_stats, bp); 227 biodone(bp); 228} 229 230static int 231mlxd_probe(device_t dev) 232{ 233 | 214 215 if (bp->b_flags & B_ERROR) 216 bp->b_error = EIO; 217 else 218 bp->b_resid = 0; 219 220 devstat_end_transaction_buf(&sc->mlxd_stats, bp); 221 biodone(bp); 222} 223 224static int 225mlxd_probe(device_t dev) 226{ 227 |
234 debug("called"); | 228 debug_called(1); |
235 236 device_set_desc(dev, "Mylex System Drive"); 237 return (0); 238} 239 240static int 241mlxd_attach(device_t dev) 242{ 243 struct mlxd_softc *sc = (struct mlxd_softc *)device_get_softc(dev); 244 device_t parent; 245 char *state; 246 dev_t dsk; 247 | 229 230 device_set_desc(dev, "Mylex System Drive"); 231 return (0); 232} 233 234static int 235mlxd_attach(device_t dev) 236{ 237 struct mlxd_softc *sc = (struct mlxd_softc *)device_get_softc(dev); 238 device_t parent; 239 char *state; 240 dev_t dsk; 241 |
248 debug("called"); | 242 debug_called(1); |
249 250 parent = device_get_parent(dev); 251 sc->mlxd_controller = (struct mlx_softc *)device_get_softc(parent); 252 sc->mlxd_unit = device_get_unit(dev); 253 sc->mlxd_drive = device_get_ivars(dev); 254 sc->mlxd_dev = dev; 255 256 switch(sc->mlxd_drive->ms_state) { --- 29 unchanged lines hidden (view full) --- 286 return (0); 287} 288 289static int 290mlxd_detach(device_t dev) 291{ 292 struct mlxd_softc *sc = (struct mlxd_softc *)device_get_softc(dev); 293 | 243 244 parent = device_get_parent(dev); 245 sc->mlxd_controller = (struct mlx_softc *)device_get_softc(parent); 246 sc->mlxd_unit = device_get_unit(dev); 247 sc->mlxd_drive = device_get_ivars(dev); 248 sc->mlxd_dev = dev; 249 250 switch(sc->mlxd_drive->ms_state) { --- 29 unchanged lines hidden (view full) --- 280 return (0); 281} 282 283static int 284mlxd_detach(device_t dev) 285{ 286 struct mlxd_softc *sc = (struct mlxd_softc *)device_get_softc(dev); 287 |
294 debug("called"); | 288 debug_called(1); |
295 296 devstat_remove_entry(&sc->mlxd_stats); 297 298 /* hack to handle lack of destroy_disk() */ 299 if (--disks_registered == 0) 300 cdevsw_remove(&mlxddisk_cdevsw); 301 302 return(0); 303} 304 | 289 290 devstat_remove_entry(&sc->mlxd_stats); 291 292 /* hack to handle lack of destroy_disk() */ 293 if (--disks_registered == 0) 294 cdevsw_remove(&mlxddisk_cdevsw); 295 296 return(0); 297} 298 |