staging: dgnc: remove sysfs files
The dgnc driver has no business creating "custom" sysfs files just for a single tty driver. Combined with the odd way they are created, it's just a mess, so remove them entirely as I am tired of tripping over them when doing driver core changes. Cc: Lidza Louina <lidza.louina@gmail.com> Cc: Mark Hounschell <markh@compro.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
f1706cb74e
commit
1eb388b67a
|
@ -2,5 +2,4 @@ obj-$(CONFIG_DGNC) += dgnc.o
|
||||||
|
|
||||||
dgnc-objs := dgnc_cls.o dgnc_driver.o\
|
dgnc-objs := dgnc_cls.o dgnc_driver.o\
|
||||||
dgnc_mgmt.o dgnc_neo.o\
|
dgnc_mgmt.o dgnc_neo.o\
|
||||||
dgnc_tty.o dgnc_sysfs.o\
|
dgnc_tty.o dgnc_utils.o
|
||||||
dgnc_utils.o
|
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
#include "dgnc_tty.h"
|
#include "dgnc_tty.h"
|
||||||
#include "dgnc_cls.h"
|
#include "dgnc_cls.h"
|
||||||
#include "dgnc_neo.h"
|
#include "dgnc_neo.h"
|
||||||
#include "dgnc_sysfs.h"
|
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_AUTHOR("Digi International, http://www.digi.com");
|
MODULE_AUTHOR("Digi International, http://www.digi.com");
|
||||||
|
@ -419,8 +418,6 @@ static int dgnc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
brd->state = BOARD_READY;
|
brd->state = BOARD_READY;
|
||||||
brd->dpastatus = BD_RUNNING;
|
brd->dpastatus = BD_RUNNING;
|
||||||
|
|
||||||
dgnc_create_ports_sysfiles(brd);
|
|
||||||
|
|
||||||
dgnc_board[dgnc_num_boards++] = brd;
|
dgnc_board[dgnc_num_boards++] = brd;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -555,7 +552,7 @@ static void dgnc_cleanup_board(struct dgnc_board *brd)
|
||||||
|
|
||||||
/* Driver load/unload functions */
|
/* Driver load/unload functions */
|
||||||
|
|
||||||
static void cleanup(bool sysfiles)
|
static void cleanup(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -567,15 +564,11 @@ static void cleanup(bool sysfiles)
|
||||||
/* Turn off poller right away. */
|
/* Turn off poller right away. */
|
||||||
del_timer_sync(&dgnc_poll_timer);
|
del_timer_sync(&dgnc_poll_timer);
|
||||||
|
|
||||||
if (sysfiles)
|
|
||||||
dgnc_remove_driver_sysfiles(&dgnc_driver);
|
|
||||||
|
|
||||||
device_destroy(dgnc_class, MKDEV(dgnc_major, 0));
|
device_destroy(dgnc_class, MKDEV(dgnc_major, 0));
|
||||||
class_destroy(dgnc_class);
|
class_destroy(dgnc_class);
|
||||||
unregister_chrdev(dgnc_major, "dgnc");
|
unregister_chrdev(dgnc_major, "dgnc");
|
||||||
|
|
||||||
for (i = 0; i < dgnc_num_boards; ++i) {
|
for (i = 0; i < dgnc_num_boards; ++i) {
|
||||||
dgnc_remove_ports_sysfiles(dgnc_board[i]);
|
|
||||||
dgnc_cleanup_tty(dgnc_board[i]);
|
dgnc_cleanup_tty(dgnc_board[i]);
|
||||||
dgnc_cleanup_board(dgnc_board[i]);
|
dgnc_cleanup_board(dgnc_board[i]);
|
||||||
}
|
}
|
||||||
|
@ -588,7 +581,7 @@ static void cleanup(bool sysfiles)
|
||||||
*/
|
*/
|
||||||
static void __exit dgnc_cleanup_module(void)
|
static void __exit dgnc_cleanup_module(void)
|
||||||
{
|
{
|
||||||
cleanup(true);
|
cleanup();
|
||||||
pci_unregister_driver(&dgnc_driver);
|
pci_unregister_driver(&dgnc_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -613,10 +606,9 @@ static int __init dgnc_init_module(void)
|
||||||
rc = pci_register_driver(&dgnc_driver);
|
rc = pci_register_driver(&dgnc_driver);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
pr_warn("WARNING: dgnc driver load failed. No Digi Neo or Classic boards found.\n");
|
pr_warn("WARNING: dgnc driver load failed. No Digi Neo or Classic boards found.\n");
|
||||||
cleanup(false);
|
cleanup();
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
dgnc_create_driver_sysfiles(&dgnc_driver);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
#include "digi.h" /* Digi specific ioctl header */
|
#include "digi.h" /* Digi specific ioctl header */
|
||||||
#include "dgnc_sysfs.h" /* Support for SYSFS */
|
|
||||||
|
|
||||||
/* Driver defines */
|
/* Driver defines */
|
||||||
|
|
||||||
|
|
|
@ -1,703 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2004 Digi International (www.digi.com)
|
|
||||||
* Scott H Kilau <Scott_Kilau at digi dot com>
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
|
|
||||||
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE. See the GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/ctype.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
#include <linux/serial_reg.h>
|
|
||||||
#include <linux/device.h>
|
|
||||||
#include <linux/pci.h>
|
|
||||||
#include <linux/kdev_t.h>
|
|
||||||
|
|
||||||
#include "dgnc_driver.h"
|
|
||||||
#include "dgnc_mgmt.h"
|
|
||||||
|
|
||||||
static ssize_t version_show(struct device_driver *ddp, char *buf)
|
|
||||||
{
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%s\n", DG_PART);
|
|
||||||
}
|
|
||||||
static DRIVER_ATTR_RO(version);
|
|
||||||
|
|
||||||
static ssize_t boards_show(struct device_driver *ddp, char *buf)
|
|
||||||
{
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%d\n", dgnc_num_boards);
|
|
||||||
}
|
|
||||||
static DRIVER_ATTR_RO(boards);
|
|
||||||
|
|
||||||
static ssize_t maxboards_show(struct device_driver *ddp, char *buf)
|
|
||||||
{
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%d\n", MAXBOARDS);
|
|
||||||
}
|
|
||||||
static DRIVER_ATTR_RO(maxboards);
|
|
||||||
|
|
||||||
static ssize_t pollrate_show(struct device_driver *ddp, char *buf)
|
|
||||||
{
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%dms\n", dgnc_poll_tick);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t pollrate_store(struct device_driver *ddp,
|
|
||||||
const char *buf, size_t count)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
int tick;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = sscanf(buf, "%d\n", &tick);
|
|
||||||
if (ret != 1)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&dgnc_poll_lock, flags);
|
|
||||||
dgnc_poll_tick = tick;
|
|
||||||
spin_unlock_irqrestore(&dgnc_poll_lock, flags);
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DRIVER_ATTR_RW(pollrate);
|
|
||||||
|
|
||||||
void dgnc_create_driver_sysfiles(struct pci_driver *dgnc_driver)
|
|
||||||
{
|
|
||||||
int rc = 0;
|
|
||||||
struct device_driver *driverfs = &dgnc_driver->driver;
|
|
||||||
|
|
||||||
rc |= driver_create_file(driverfs, &driver_attr_version);
|
|
||||||
rc |= driver_create_file(driverfs, &driver_attr_boards);
|
|
||||||
rc |= driver_create_file(driverfs, &driver_attr_maxboards);
|
|
||||||
rc |= driver_create_file(driverfs, &driver_attr_pollrate);
|
|
||||||
if (rc)
|
|
||||||
pr_err("DGNC: sysfs driver_create_file failed!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void dgnc_remove_driver_sysfiles(struct pci_driver *dgnc_driver)
|
|
||||||
{
|
|
||||||
struct device_driver *driverfs = &dgnc_driver->driver;
|
|
||||||
|
|
||||||
driver_remove_file(driverfs, &driver_attr_version);
|
|
||||||
driver_remove_file(driverfs, &driver_attr_boards);
|
|
||||||
driver_remove_file(driverfs, &driver_attr_maxboards);
|
|
||||||
driver_remove_file(driverfs, &driver_attr_pollrate);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DGNC_VERIFY_BOARD(p, bd) \
|
|
||||||
do { \
|
|
||||||
if (!p) \
|
|
||||||
return 0; \
|
|
||||||
\
|
|
||||||
bd = dev_get_drvdata(p); \
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC) \
|
|
||||||
return 0; \
|
|
||||||
if (bd->state != BOARD_READY) \
|
|
||||||
return 0; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
static ssize_t vpd_show(struct device *p, struct device_attribute *attr,
|
|
||||||
char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
count += sprintf(buf + count,
|
|
||||||
"\n 0 1 2 3 4 5 6 7 8 9 A B C D E F");
|
|
||||||
for (i = 0; i < 0x40 * 2; i++) {
|
|
||||||
if (!(i % 16))
|
|
||||||
count += sprintf(buf + count, "\n%04X ", i * 2);
|
|
||||||
count += sprintf(buf + count, "%02X ", bd->vpd[i]);
|
|
||||||
}
|
|
||||||
count += sprintf(buf + count, "\n");
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(vpd);
|
|
||||||
|
|
||||||
static ssize_t serial_number_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
if (bd->serial_num[0] == '\0')
|
|
||||||
count += sprintf(buf + count, "<UNKNOWN>\n");
|
|
||||||
else
|
|
||||||
count += sprintf(buf + count, "%s\n", bd->serial_num);
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(serial_number);
|
|
||||||
|
|
||||||
static ssize_t ports_state_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
for (i = 0; i < bd->nasync; i++) {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count,
|
|
||||||
"%d %s\n", bd->channels[i]->ch_portnum,
|
|
||||||
bd->channels[i]->ch_open_count ? "Open" : "Closed");
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(ports_state);
|
|
||||||
|
|
||||||
static ssize_t ports_baud_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
for (i = 0; i < bd->nasync; i++) {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count,
|
|
||||||
"%d %d\n", bd->channels[i]->ch_portnum,
|
|
||||||
bd->channels[i]->ch_old_baud);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(ports_baud);
|
|
||||||
|
|
||||||
static ssize_t ports_msignals_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
for (i = 0; i < bd->nasync; i++) {
|
|
||||||
struct channel_t *ch = bd->channels[i];
|
|
||||||
|
|
||||||
if (ch->ch_open_count) {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count,
|
|
||||||
"%d %s %s %s %s %s %s\n",
|
|
||||||
ch->ch_portnum,
|
|
||||||
(ch->ch_mostat & UART_MCR_RTS) ? "RTS" : "",
|
|
||||||
(ch->ch_mistat & UART_MSR_CTS) ? "CTS" : "",
|
|
||||||
(ch->ch_mostat & UART_MCR_DTR) ? "DTR" : "",
|
|
||||||
(ch->ch_mistat & UART_MSR_DSR) ? "DSR" : "",
|
|
||||||
(ch->ch_mistat & UART_MSR_DCD) ? "DCD" : "",
|
|
||||||
(ch->ch_mistat & UART_MSR_RI) ? "RI" : "");
|
|
||||||
} else {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count,
|
|
||||||
"%d\n", ch->ch_portnum);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(ports_msignals);
|
|
||||||
|
|
||||||
static ssize_t ports_iflag_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
for (i = 0; i < bd->nasync; i++) {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
|
|
||||||
bd->channels[i]->ch_portnum,
|
|
||||||
bd->channels[i]->ch_c_iflag);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(ports_iflag);
|
|
||||||
|
|
||||||
static ssize_t ports_cflag_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
for (i = 0; i < bd->nasync; i++) {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
|
|
||||||
bd->channels[i]->ch_portnum,
|
|
||||||
bd->channels[i]->ch_c_cflag);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(ports_cflag);
|
|
||||||
|
|
||||||
static ssize_t ports_oflag_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
for (i = 0; i < bd->nasync; i++) {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
|
|
||||||
bd->channels[i]->ch_portnum,
|
|
||||||
bd->channels[i]->ch_c_oflag);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(ports_oflag);
|
|
||||||
|
|
||||||
static ssize_t ports_lflag_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
for (i = 0; i < bd->nasync; i++) {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
|
|
||||||
bd->channels[i]->ch_portnum,
|
|
||||||
bd->channels[i]->ch_c_lflag);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(ports_lflag);
|
|
||||||
|
|
||||||
static ssize_t ports_digi_flag_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
for (i = 0; i < bd->nasync; i++) {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
|
|
||||||
bd->channels[i]->ch_portnum,
|
|
||||||
bd->channels[i]->ch_digi.digi_flags);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(ports_digi_flag);
|
|
||||||
|
|
||||||
static ssize_t ports_rxcount_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
for (i = 0; i < bd->nasync; i++) {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count, "%d %ld\n",
|
|
||||||
bd->channels[i]->ch_portnum,
|
|
||||||
bd->channels[i]->ch_rxcount);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(ports_rxcount);
|
|
||||||
|
|
||||||
static ssize_t ports_txcount_show(struct device *p,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
int count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
DGNC_VERIFY_BOARD(p, bd);
|
|
||||||
|
|
||||||
for (i = 0; i < bd->nasync; i++) {
|
|
||||||
count += snprintf(buf + count, PAGE_SIZE - count, "%d %ld\n",
|
|
||||||
bd->channels[i]->ch_portnum,
|
|
||||||
bd->channels[i]->ch_txcount);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(ports_txcount);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* this function creates the sys files that will export each signal status
|
|
||||||
* to sysfs each value will be put in a separate filename
|
|
||||||
*/
|
|
||||||
void dgnc_create_ports_sysfiles(struct dgnc_board *bd)
|
|
||||||
{
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
dev_set_drvdata(&bd->pdev->dev, bd);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_state);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_baud);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_msignals);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_iflag);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_cflag);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_oflag);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_lflag);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_digi_flag);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_rxcount);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_txcount);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_vpd);
|
|
||||||
rc |= device_create_file(&bd->pdev->dev, &dev_attr_serial_number);
|
|
||||||
if (rc)
|
|
||||||
dev_err(&bd->pdev->dev, "dgnc: sysfs device_create_file failed!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* removes all the sys files created for that port */
|
|
||||||
void dgnc_remove_ports_sysfiles(struct dgnc_board *bd)
|
|
||||||
{
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_ports_state);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_ports_baud);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_ports_msignals);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_ports_iflag);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_ports_cflag);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_ports_oflag);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_ports_lflag);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_ports_digi_flag);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_ports_rxcount);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_ports_txcount);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_vpd);
|
|
||||||
device_remove_file(&bd->pdev->dev, &dev_attr_serial_number);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t tty_state_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%s",
|
|
||||||
un->un_open_count ? "Open" : "Closed");
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_state);
|
|
||||||
|
|
||||||
static ssize_t tty_baud_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%d\n", ch->ch_old_baud);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_baud);
|
|
||||||
|
|
||||||
static ssize_t tty_msignals_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (ch->ch_open_count) {
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%s %s %s %s %s %s\n",
|
|
||||||
(ch->ch_mostat & UART_MCR_RTS) ? "RTS" : "",
|
|
||||||
(ch->ch_mistat & UART_MSR_CTS) ? "CTS" : "",
|
|
||||||
(ch->ch_mostat & UART_MCR_DTR) ? "DTR" : "",
|
|
||||||
(ch->ch_mistat & UART_MSR_DSR) ? "DSR" : "",
|
|
||||||
(ch->ch_mistat & UART_MSR_DCD) ? "DCD" : "",
|
|
||||||
(ch->ch_mistat & UART_MSR_RI) ? "RI" : "");
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_msignals);
|
|
||||||
|
|
||||||
static ssize_t tty_iflag_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_iflag);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_iflag);
|
|
||||||
|
|
||||||
static ssize_t tty_cflag_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_cflag);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_cflag);
|
|
||||||
|
|
||||||
static ssize_t tty_oflag_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_oflag);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_oflag);
|
|
||||||
|
|
||||||
static ssize_t tty_lflag_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_lflag);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_lflag);
|
|
||||||
|
|
||||||
static ssize_t tty_digi_flag_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_digi.digi_flags);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_digi_flag);
|
|
||||||
|
|
||||||
static ssize_t tty_rxcount_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%ld\n", ch->ch_rxcount);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_rxcount);
|
|
||||||
|
|
||||||
static ssize_t tty_txcount_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%ld\n", ch->ch_txcount);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_txcount);
|
|
||||||
|
|
||||||
static ssize_t tty_custom_name_show(struct device *d,
|
|
||||||
struct device_attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct dgnc_board *bd;
|
|
||||||
struct channel_t *ch;
|
|
||||||
struct un_t *un;
|
|
||||||
|
|
||||||
if (!d)
|
|
||||||
return 0;
|
|
||||||
un = dev_get_drvdata(d);
|
|
||||||
if (!un || un->magic != DGNC_UNIT_MAGIC)
|
|
||||||
return 0;
|
|
||||||
ch = un->un_ch;
|
|
||||||
if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
|
|
||||||
return 0;
|
|
||||||
bd = ch->ch_bd;
|
|
||||||
if (!bd || bd->magic != DGNC_BOARD_MAGIC)
|
|
||||||
return 0;
|
|
||||||
if (bd->state != BOARD_READY)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%sn%d%c\n",
|
|
||||||
(un->un_type == DGNC_PRINT) ? "pr" : "tty",
|
|
||||||
bd->boardnum + 1, 'a' + ch->ch_portnum);
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RO(tty_custom_name);
|
|
||||||
|
|
||||||
static struct attribute *dgnc_sysfs_tty_entries[] = {
|
|
||||||
&dev_attr_tty_state.attr,
|
|
||||||
&dev_attr_tty_baud.attr,
|
|
||||||
&dev_attr_tty_msignals.attr,
|
|
||||||
&dev_attr_tty_iflag.attr,
|
|
||||||
&dev_attr_tty_cflag.attr,
|
|
||||||
&dev_attr_tty_oflag.attr,
|
|
||||||
&dev_attr_tty_lflag.attr,
|
|
||||||
&dev_attr_tty_digi_flag.attr,
|
|
||||||
&dev_attr_tty_rxcount.attr,
|
|
||||||
&dev_attr_tty_txcount.attr,
|
|
||||||
&dev_attr_tty_custom_name.attr,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct attribute_group dgnc_tty_attribute_group = {
|
|
||||||
.name = NULL,
|
|
||||||
.attrs = dgnc_sysfs_tty_entries,
|
|
||||||
};
|
|
||||||
|
|
||||||
void dgnc_create_tty_sysfs(struct un_t *un, struct device *c)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = sysfs_create_group(&c->kobj, &dgnc_tty_attribute_group);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(c, "dgnc: failed to create sysfs tty device attributes.\n");
|
|
||||||
sysfs_remove_group(&c->kobj, &dgnc_tty_attribute_group);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_set_drvdata(c, un);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dgnc_remove_tty_sysfs(struct device *c)
|
|
||||||
{
|
|
||||||
sysfs_remove_group(&c->kobj, &dgnc_tty_attribute_group);
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2003 Digi International (www.digi.com)
|
|
||||||
* Scott H Kilau <Scott_Kilau at digi dot com>
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
|
|
||||||
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE. See the GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __DGNC_SYSFS_H
|
|
||||||
#define __DGNC_SYSFS_H
|
|
||||||
|
|
||||||
#include <linux/device.h>
|
|
||||||
#include "dgnc_driver.h"
|
|
||||||
|
|
||||||
struct dgnc_board;
|
|
||||||
struct channel_t;
|
|
||||||
struct un_t;
|
|
||||||
struct pci_driver;
|
|
||||||
struct class_device;
|
|
||||||
|
|
||||||
void dgnc_create_ports_sysfiles(struct dgnc_board *bd);
|
|
||||||
void dgnc_remove_ports_sysfiles(struct dgnc_board *bd);
|
|
||||||
|
|
||||||
void dgnc_create_driver_sysfiles(struct pci_driver *);
|
|
||||||
void dgnc_remove_driver_sysfiles(struct pci_driver *);
|
|
||||||
|
|
||||||
int dgnc_tty_class_init(void);
|
|
||||||
int dgnc_tty_class_destroy(void);
|
|
||||||
|
|
||||||
void dgnc_create_tty_sysfs(struct un_t *un, struct device *c);
|
|
||||||
void dgnc_remove_tty_sysfs(struct device *c);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -35,7 +35,6 @@
|
||||||
#include "dgnc_tty.h"
|
#include "dgnc_tty.h"
|
||||||
#include "dgnc_neo.h"
|
#include "dgnc_neo.h"
|
||||||
#include "dgnc_cls.h"
|
#include "dgnc_cls.h"
|
||||||
#include "dgnc_sysfs.h"
|
|
||||||
#include "dgnc_utils.h"
|
#include "dgnc_utils.h"
|
||||||
|
|
||||||
/* Default transparent print information. */
|
/* Default transparent print information. */
|
||||||
|
@ -304,12 +303,10 @@ int dgnc_tty_init(struct dgnc_board *brd)
|
||||||
classp = tty_register_device(brd->serial_driver, i,
|
classp = tty_register_device(brd->serial_driver, i,
|
||||||
&ch->ch_bd->pdev->dev);
|
&ch->ch_bd->pdev->dev);
|
||||||
ch->ch_tun.un_sysfs = classp;
|
ch->ch_tun.un_sysfs = classp;
|
||||||
dgnc_create_tty_sysfs(&ch->ch_tun, classp);
|
|
||||||
|
|
||||||
classp = tty_register_device(brd->print_driver, i,
|
classp = tty_register_device(brd->print_driver, i,
|
||||||
&ch->ch_bd->pdev->dev);
|
&ch->ch_bd->pdev->dev);
|
||||||
ch->ch_pun.un_sysfs = classp;
|
ch->ch_pun.un_sysfs = classp;
|
||||||
dgnc_create_tty_sysfs(&ch->ch_pun, classp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,20 +330,14 @@ void dgnc_cleanup_tty(struct dgnc_board *brd)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
for (i = 0; i < brd->nasync; i++) {
|
for (i = 0; i < brd->nasync; i++)
|
||||||
if (brd->channels[i])
|
|
||||||
dgnc_remove_tty_sysfs(brd->channels[i]->
|
|
||||||
ch_tun.un_sysfs);
|
|
||||||
tty_unregister_device(brd->serial_driver, i);
|
tty_unregister_device(brd->serial_driver, i);
|
||||||
}
|
|
||||||
tty_unregister_driver(brd->serial_driver);
|
tty_unregister_driver(brd->serial_driver);
|
||||||
|
|
||||||
for (i = 0; i < brd->nasync; i++) {
|
for (i = 0; i < brd->nasync; i++)
|
||||||
if (brd->channels[i])
|
|
||||||
dgnc_remove_tty_sysfs(brd->channels[i]->
|
|
||||||
ch_pun.un_sysfs);
|
|
||||||
tty_unregister_device(brd->print_driver, i);
|
tty_unregister_device(brd->print_driver, i);
|
||||||
}
|
|
||||||
tty_unregister_driver(brd->print_driver);
|
tty_unregister_driver(brd->print_driver);
|
||||||
|
|
||||||
put_tty_driver(brd->serial_driver);
|
put_tty_driver(brd->serial_driver);
|
||||||
|
|
Loading…
Reference in New Issue