Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/mpr/mpr.c
Show First 20 Lines • Show All 1,523 Lines • ▼ Show 20 Lines | return (ENOMEM); | ||||
} | } | ||||
/* | /* | ||||
* SMID 0 cannot be used as a free command per the firmware spec. | * SMID 0 cannot be used as a free command per the firmware spec. | ||||
* Just drop that command instead of risking accounting bugs. | * Just drop that command instead of risking accounting bugs. | ||||
*/ | */ | ||||
sc->commands = malloc(sizeof(struct mpr_command) * sc->num_reqs, | sc->commands = malloc(sizeof(struct mpr_command) * sc->num_reqs, | ||||
M_MPR, M_WAITOK | M_ZERO); | M_MPR, M_WAITOK | M_ZERO); | ||||
if (!sc->commands) { | |||||
mpr_dprint(sc, MPR_ERROR, "Cannot allocate command memory\n"); | |||||
return (ENOMEM); | |||||
} | |||||
for (i = 1; i < sc->num_reqs; i++) { | for (i = 1; i < sc->num_reqs; i++) { | ||||
cm = &sc->commands[i]; | cm = &sc->commands[i]; | ||||
cm->cm_req = sc->req_frames + i * sc->reqframesz; | cm->cm_req = sc->req_frames + i * sc->reqframesz; | ||||
cm->cm_req_busaddr = sc->req_busaddr + i * sc->reqframesz; | cm->cm_req_busaddr = sc->req_busaddr + i * sc->reqframesz; | ||||
cm->cm_sense = &sc->sense_frames[i]; | cm->cm_sense = &sc->sense_frames[i]; | ||||
cm->cm_sense_busaddr = sc->sense_busaddr + i * MPR_SENSE_LEN; | cm->cm_sense_busaddr = sc->sense_busaddr + i * MPR_SENSE_LEN; | ||||
cm->cm_desc.Default.SMID = i; | cm->cm_desc.Default.SMID = i; | ||||
cm->cm_sc = sc; | cm->cm_sc = sc; | ||||
▲ Show 20 Lines • Show All 1,135 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
mpr_register_events(struct mpr_softc *sc, uint8_t *mask, | mpr_register_events(struct mpr_softc *sc, uint8_t *mask, | ||||
mpr_evt_callback_t *cb, void *data, struct mpr_event_handle **handle) | mpr_evt_callback_t *cb, void *data, struct mpr_event_handle **handle) | ||||
{ | { | ||||
struct mpr_event_handle *eh; | struct mpr_event_handle *eh; | ||||
int error = 0; | int error = 0; | ||||
eh = malloc(sizeof(struct mpr_event_handle), M_MPR, M_WAITOK|M_ZERO); | eh = malloc(sizeof(struct mpr_event_handle), M_MPR, M_WAITOK|M_ZERO); | ||||
if (!eh) { | |||||
mpr_dprint(sc, MPR_EVENT|MPR_ERROR, | |||||
"Cannot allocate event memory\n"); | |||||
return (ENOMEM); | |||||
} | |||||
eh->callback = cb; | eh->callback = cb; | ||||
eh->data = data; | eh->data = data; | ||||
TAILQ_INSERT_TAIL(&sc->event_list, eh, eh_list); | TAILQ_INSERT_TAIL(&sc->event_list, eh, eh_list); | ||||
if (mask != NULL) | if (mask != NULL) | ||||
error = mpr_update_events(sc, eh, mask); | error = mpr_update_events(sc, eh, mask); | ||||
*handle = eh; | *handle = eh; | ||||
return (error); | return (error); | ||||
▲ Show 20 Lines • Show All 1,296 Lines • Show Last 20 Lines |