123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- #include <sys/types.h>
- #include <sys/param.h>
- #include <sys/stat.h>
- #include <sys/conf.h>
- #include <sys/modctl.h>
- #include <sys/sunddi.h>
- #include <sys/ksynch.h>
- #ifdef __STDC__
- #define __P(x) x
- #else
- #define __P(x) ()
- #endif
- static int ppp_identify __P((dev_info_t *));
- static int ppp_attach __P((dev_info_t *, ddi_attach_cmd_t));
- static int ppp_detach __P((dev_info_t *, ddi_detach_cmd_t));
- static int ppp_devinfo __P((dev_info_t *, ddi_info_cmd_t, void *, void **));
- extern struct streamtab pppinfo;
- extern krwlock_t ppp_lower_lock;
- static dev_info_t *ppp_dip;
- static struct cb_ops cb_ppp_ops = {
- nulldev, nulldev, nodev, nodev,
- nodev, nodev, nodev, nodev,
- nodev, nodev, nodev, nochpoll,
- ddi_prop_op,
- &pppinfo,
- D_NEW|D_MP|D_MTQPAIR|D_MTOUTPERIM|D_MTOCEXCL
- };
- static struct dev_ops ppp_ops = {
- DEVO_REV,
- 0,
- ppp_devinfo,
- ppp_identify,
- nulldev,
- ppp_attach,
- ppp_detach,
- nodev,
- &cb_ppp_ops,
- NULL
- };
- static struct modldrv modldrv = {
- &mod_driverops,
- "PPP-2.4.7 multiplexing driver",
- &ppp_ops
- };
- static struct modlinkage modlinkage = {
- MODREV_1,
- (void *) &modldrv,
- NULL
- };
- int
- _init(void)
- {
- return mod_install(&modlinkage);
- }
- int
- _fini(void)
- {
- return mod_remove(&modlinkage);
- }
- int
- _info(mip)
- struct modinfo *mip;
- {
- return mod_info(&modlinkage, mip);
- }
- static int
- ppp_identify(dip)
- dev_info_t *dip;
- {
-
- #ifdef DDI_IDENTIFIED
- return strcmp(ddi_get_name(dip), "ppp") == 0? DDI_IDENTIFIED:
- DDI_NOT_IDENTIFIED;
- #else
- return 0;
- #endif
- }
- static int
- ppp_attach(dip, cmd)
- dev_info_t *dip;
- ddi_attach_cmd_t cmd;
- {
- if (cmd != DDI_ATTACH)
- return DDI_FAILURE;
- if (ddi_create_minor_node(dip, "ppp", S_IFCHR, 0, DDI_PSEUDO, CLONE_DEV)
- == DDI_FAILURE) {
- ddi_remove_minor_node(dip, NULL);
- return DDI_FAILURE;
- }
- rw_init(&ppp_lower_lock, NULL, RW_DRIVER, NULL);
- return DDI_SUCCESS;
- }
- static int
- ppp_detach(dip, cmd)
- dev_info_t *dip;
- ddi_detach_cmd_t cmd;
- {
- rw_destroy(&ppp_lower_lock);
- ddi_remove_minor_node(dip, NULL);
- return DDI_SUCCESS;
- }
- static int
- ppp_devinfo(dip, cmd, arg, result)
- dev_info_t *dip;
- ddi_info_cmd_t cmd;
- void *arg;
- void **result;
- {
- int error;
- error = DDI_SUCCESS;
- switch (cmd) {
- case DDI_INFO_DEVT2DEVINFO:
- if (ppp_dip == NULL)
- error = DDI_FAILURE;
- else
- *result = (void *) ppp_dip;
- break;
- case DDI_INFO_DEVT2INSTANCE:
- *result = NULL;
- break;
- default:
- error = DDI_FAILURE;
- }
- return error;
- }
|