8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * CDDL HEADER START
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * The contents of this file are subject to the terms of the
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * Common Development and Distribution License, Version 1.0 only
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * (the "License"). You may not use this file except in compliance
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * with the License.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * or http://www.opensolaris.org/os/licensing.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * See the License for the specific language governing permissions
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * and limitations under the License.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * When distributing Covered Code, include this CDDL HEADER in each
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * If applicable, add the following below this CDDL HEADER, with the
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * fields enclosed by brackets "[]" replaced with your own identifying
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * information: Portions Copyright [yyyy] [name of copyright owner]
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * CDDL HEADER END
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * Use is subject to license terms.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#pragma ident "%Z%%M% %I% %E% SMI"
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include "devfsadm.h"
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <stdio.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <stdlib.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <limits.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <string.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#define DCAM_RE_STRING_LEN 64
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#define DCAM_STR_LINK_RE "^dcam([0-9]+)$"
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#define DCAM_CTL_LINK_RE "^dcamctl([0-9]+)$"
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499apstatic int dcam1394_process(di_minor_t minor, di_node_t node);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499apstatic devfsadm_create_t dcam1394_cbt[] = {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap "firewire",
8eea8e29cc4374d1ee24c25a07f45af132db3499ap NULL,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap "dcam",
8eea8e29cc4374d1ee24c25a07f45af132db3499ap DRV_RE,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ILEVEL_0,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap dcam1394_process
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap};
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499apstatic char *debug_mid = "dcam1394_mid";
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499apDEVFSADM_CREATE_INIT_V0(dcam1394_cbt);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499apstatic devfsadm_remove_t dcam1394_remove_cbt[] = {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap "firewire",
8eea8e29cc4374d1ee24c25a07f45af132db3499ap DCAM_STR_LINK_RE,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap RM_PRE | RM_HOT | RM_ALWAYS,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ILEVEL_0,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap devfsadm_rm_all
8eea8e29cc4374d1ee24c25a07f45af132db3499ap },
8eea8e29cc4374d1ee24c25a07f45af132db3499ap {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap "firewire",
8eea8e29cc4374d1ee24c25a07f45af132db3499ap DCAM_CTL_LINK_RE,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap RM_PRE | RM_HOT | RM_ALWAYS,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ILEVEL_0,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap devfsadm_rm_all
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap};
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499apDEVFSADM_REMOVE_INIT_V0(dcam1394_remove_cbt);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499apint
8eea8e29cc4374d1ee24c25a07f45af132db3499apminor_init(void)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap devfsadm_print(debug_mid, "dcam1394_link: minor_init\n");
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (DEVFSADM_SUCCESS);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499apint
8eea8e29cc4374d1ee24c25a07f45af132db3499apminor_fini(void)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap devfsadm_print(debug_mid, "dcam1394_link: minor_fini\n");
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (DEVFSADM_SUCCESS);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * This function is called for every dcam1394 minor node.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * Calls enumerate to assign a logical dcam1394 id, and then
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * devfsadm_mklink to make the link.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499apstatic int
8eea8e29cc4374d1ee24c25a07f45af132db3499apdcam1394_process(di_minor_t minor, di_node_t node)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap char m_name[PATH_MAX], restring0[DCAM_RE_STRING_LEN];
8eea8e29cc4374d1ee24c25a07f45af132db3499ap char l_path[PATH_MAX], p_path[PATH_MAX], *buf, *devfspath;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap devfsadm_enumerate_t re[1];
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (void) strcpy(m_name, di_minor_name(minor));
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (strcmp(di_driver_name(node), "dcam1394") != 0) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (DEVFSADM_CONTINUE);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (strncmp(m_name, "dcamctl", 7) == 0) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (void) snprintf(restring0, DCAM_RE_STRING_LEN,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap DCAM_CTL_LINK_RE);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap } else if (strncmp(m_name, "dcam", 4) == 0) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (void) snprintf(restring0, DCAM_RE_STRING_LEN,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap DCAM_STR_LINK_RE);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap } else {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (DEVFSADM_CONTINUE);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap re[0].re = restring0;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap re[0].subexp = 1;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap re[0].flags = MATCH_ALL;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap devfsadm_print(debug_mid,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap "dcam1394_process: path %s\n", di_devfs_path(node));
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (void) strcpy(p_path, devfspath = di_devfs_path(node));
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (void) strcat(p_path, ":");
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (void) strcat(p_path, di_minor_name(minor));
8eea8e29cc4374d1ee24c25a07f45af132db3499ap di_devfs_path_free(devfspath);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap /*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * Build the physical path from the components, omitting
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * minor name field. Find the logical dcam1394 id, and
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * stuff it in buf.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (devfsadm_enumerate_int(p_path, 0, &buf, re, 1)) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap devfsadm_print(debug_mid,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap "dcam1394_process: exit/continue\n");
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (DEVFSADM_CONTINUE);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap devfsadm_print(debug_mid, "dcam1394_process: p_path=%s buf=%s\n",
8eea8e29cc4374d1ee24c25a07f45af132db3499ap p_path, buf);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (strncmp(di_minor_name(minor), "dcamctl", 7) == 0)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (void) snprintf(l_path, PATH_MAX, "dcamctl%s", buf);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap else
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (void) snprintf(l_path, PATH_MAX, "dcam%s", buf);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (void) devfsadm_mklink(l_path, node, minor, 0);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap free(buf);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (DEVFSADM_CONTINUE);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}