|
|
1.1 ! root 1: general I/O stats/config mechanism ! 2: ! 3: * new kern_dev rpcs ! 4: ! 5: to find out what lives: ! 6: ! 7: dev_return_t dev_inquire( ! 8: port_t device_master, // same as Config uses? ! 9: int unit, // global device "unit num space" ! 10: devname_t *devname, // IODevice's devname (sd0, etc) ! 11: ); ! 12: ! 13: to get general parameter for unit n: ! 14: ! 15: dev_return_t dev_param( ! 16: port_t device_master, ! 17: int unit, ! 18: char paramName[PARAM_NAME_SIZE], ! 19: int *parameter, // returned ! 20: ); ! 21: ! 22: to set general parameter in unit n: ! 23: ! 24: dev_return_t dev_set_param( ! 25: port_t device_master, ! 26: int unit, ! 27: char paramName[PARAM_NAME_SIZE], ! 28: int parameter // returned ! 29: ); ! 30: ! 31: -- devname should be sufficient key to allow appropriate App to decide ! 32: whether or not to do dev_params() on that unit. ! 33: -- DiskObject should override deviceRegister:, only pass up calls for ! 34: physical devices. (Maybe not...want to register rsd0a... ! 35: ! 36: * IODevice instance variables ! 37: char deviceType[] ! 38: e.g. "LogicalDisk", "SCSIDisk" (or maybe just "Disk"), "EtherNet" ! 39: char deviceName[] ! 40: e.g. "SCSIDisk0", "BlockSCSIDisk0a", etc. ! 41: ! 42: * IODevice methods ! 43: - (dev_return_t)getParam:(const char *)paramName param:(int *)parameter; ! 44: - (dev_return_t)setParam:(const char *)paramName param:(int)parameter; ! 45: ! 46: * Any subclass can override these to handle new parameters; any not ! 47: known are passed up to [super getParam:]. ! 48: ! 49: e.g. in NetDriver: ! 50: ! 51: - (int)getParam:(const char *)paramName ! 52: { ! 53: if(strcmp(paramName, "inPackets")) ! 54: return (if_ipackets([self getNetif]); ! 55: else if (...) ! 56: return whatever; ! 57: else ! 58: return [super getParam:paramName]; ! 59: } ! 60: ! 61: * Dispatching from kern_dev to instance: ! 62: -- need to map unit to id. ! 63: -- needs to work the same in user space! shlib version of IODevice needs ! 64: to provide a "user_device_master" port, advertised in nmserver, ! 65: providing these same functions... ! 66: ! 67: IODevice's registerDevice: ! 68: ! 69: typedef struct { ! 70: id instance; ! 71: int unit; ! 72: queue_chain_t link; ! 73: } unitToIdMap_t; ! 74: ! 75: /* ! 76: * Both of these should be locked with a spin lock ! 77: */ ! 78: static int globalUnitCounter; ! 79: static queue_head_t unitToIdList; // queue of unitToIdMap_t's ! 80: ! 81: - (int)registerDevice ! 82: { ! 83: globalUnit = globalUnitCounter++; ! 84: create a unitToIdMap_t for this instance; ! 85: enqueue it on unitToIdList; ! 86: return; ! 87: } ! 88: ! 89: kernel: ! 90: dev_return_t dev_param( ! 91: port_t device_master, ! 92: int unit, ! 93: char paramName[PARAM_NAME_SIZE], ! 94: int *parameter) // returned ! 95: { ! 96: return IODeviceParameter(unit, paramName, parameter); ! 97: } ! 98: ! 99: dev_return_t dev_set_param( ! 100: port_t device_master; ! 101: int unit; ! 102: char paramName[PARAM_NAME_SIZE]; ! 103: int parameter) ! 104: { ! 105: return IODeviceSetParameter(unit, paramName, parameter); ! 106: } ! 107: ! 108: IODevice.m: ! 109: ! 110: dev_return_t IODeviceParameter(unit, paramName, *parameter) ! 111: { ! 112: get unitToIdMap_t for this unit; ! 113: if NULL ! 114: return error; ! 115: else ! 116: return [unitToIdMap->instance getParam:paramName]; ! 117: } ! 118: dev_return_t IODeviceSetParameter(unit, paramName, *parameter) ! 119: { ! 120: get unitToIdMap_t for this unit; ! 121: if NULL ! 122: return error; ! 123: else ! 124: return [unitToIdMap->instance setParam:paramName]; ! 125: } ! 126: ! 127: * Eventually this should work with RO? What's the name space? Maybe make ! 128: user-level wrapper around the three Kernel RPCs, do it all with RO with ! 129: one "master device object". Ideally this should just provide the id of ! 130: the desired unit, but won't wotk in the kernel...styick with RPCs to ! 131: device_master for now. ! 132: ! 133: .................................... ! 134: ! 135: returning arrays ! 136: ! 137: /* ! 138: * Get one unsigned int ! 139: */ ! 140: dev_return_t dev_param( ! 141: port_t device_master, ! 142: int unit, ! 143: char paramName[PARAM_NAME_SIZE], ! 144: unsigned int *parameter, // returned ! 145: ); ! 146: ! 147: /* ! 148: * Get an array of unsigned ints. ! 149: */ ! 150: dev_return_t dev_get_param_int( ! 151: port_t device_master, ! 152: int unit, ! 153: char paramName[PARAM_NAME_SIZE], ! 154: int maxCount, ! 155: unsigned *paramArray, // array RETURNED here ! 156: unsigned *returnedCount); // size of returned array ! 157: ! 158: /* ! 159: * Get an array of unsigned chars. ! 160: */ ! 161: dev_return_t dev_get_param_char( ! 162: port_t device_master, ! 163: int unit, ! 164: char paramName[PARAM_NAME_SIZE], ! 165: int maxCount, ! 166: unsigned char *paramArray, // array RETURNED here ! 167: unsigned *returnedCount); // size of returned array ! 168: ! 169: /* ! 170: * Set an array of unsigned ints. ! 171: */ ! 172: dev_return_t dev_set_param_int( ! 173: port_t device_master, ! 174: int unit, ! 175: char paramName[PARAM_NAME_SIZE], ! 176: int count, ! 177: unsigned int *paramArray); ! 178: ! 179: /* ! 180: * Set an array of unsigned chars. ! 181: */ ! 182: dev_return_t dev_set_param_char( ! 183: port_t device_master, ! 184: int unit, ! 185: char paramName[PARAM_NAME_SIZE], ! 186: int count, ! 187: unsigned char *paramArray);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.