Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Aug 2000 13:45:50 +0900
From:      MIHIRA Sanpei Yoshiro <sanpei@sanpei.org>
To:        mobile@FreeBSD.org
Subject:   [PCCARD,PATCH] IOC_GET_RESOURCE_RANGE patch
Message-ID:  <200008200445.e7K4jp402239@lavender.sanpei.org>

next in thread | raw e-mail | index | archive | help
Hi.
mobile user

  In 4-stable and 5-current, /usr/sbin/pccardd did not know used
resource(io) range in kernel.  We need to write free resource range
to /etc/pccard.conf from /var/run/dmesg.boot information by hand.

  I created experimental IOC_GET_RESOURCE_RANGE(but rename
PIOCSRESOURCE) ioctl code in sys/pccard which was suggested by
Warner-san.  With below patch we could read free ioport/irq/memory
resources from userland programs.
====================
# ./pccard-kernel-resource 1 280 300 10
                           ~ ~~~ ~~~ ~~
                           |  |   |   size
                           |  |   max_addr
                           |   min_addr
                           SYS_RES_IOPORT
min 0x280
max 0x300
size 0x10
resource 0x290	<-- return from ioctl
		<-- 0x280 - 0x28f was used by xe0 driver

# ./pccard-kernel-resource 2 1 15 1
                           ~ ~ ~~ ~
                           | | |   (dummy)
                           | | max_irq
                           | min_irq
                           SYS_RES_IRQ
min 0x1
max 0x15
size 0x1
resource 0x9	<-- irq 9 is free
====================

  Next step: I will add some code /usr/sbin/pccardd.

  By the way, below code was quick-hack code, I want to any
suggestions to commit into 5-current.

Cheers.
---
MIHIRA, Sanpei Yoshiro
Yokohama, Japan.

--- sys/pccard/pccard.c.orig	Sat Jun 24 07:47:17 2000
+++ sys/pccard/pccard.c	Sun Aug 20 12:58:59 2000
@@ -460,7 +460,14 @@
 	struct slot *slt = pccard_slots[minor(dev)];
 	struct mem_desc *mp;
 	struct io_desc *ip;
+	struct pccard_resource *pr;
+	struct pccard_devinfo *devi;
+	struct resource *r;
+	device_t pccarddev;
+	device_t child;
 	int s, err;
+	int rid = 0;
+	int i;
 	int	pwval;
 
 	if (slt == 0 && cmd != PIOCRWMEM)
@@ -610,6 +617,54 @@
 		if (pccard_beep_select(*(int *)data)) {
 			return EINVAL;
 		}
+		break;
+	case PIOCSRESOURCE: /* sanpei */
+		pr = (struct pccard_resource *)data;
+		pr->resource_addr = ~0ul;
+		pccarddev = devclass_get_device(pccard_devclass, 0);
+		MALLOC(devi, struct pccard_devinfo *, sizeof(*devi), M_DEVBUF, M_WAITOK);
+		bzero(devi, sizeof(*devi));
+		strcpy(devi->name, "ed");
+		devi->running = 1;
+		devi->slt = slt;
+		resource_list_init(&devi->resources);
+		child = device_add_child(pccarddev, devi->name, 3);
+	        device_set_flags(child, 0x0);
+		device_set_ivars(child, devi);
+		switch(pr->type) {
+		case SYS_RES_IOPORT:
+		case SYS_RES_MEMORY:
+			for (i = pr->min; i + pr->size <= pr->max;
+				i++) {
+				err = bus_set_resource(child, pr->type, 0, i, pr->size);
+				if (!err) {
+					r = bus_alloc_resource(child, pr->type, &rid, 0ul, ~0ul, pr->size, RF_ACTIVE);
+					if (r) { 
+						pr->resource_addr = (u_long)rman_get_start(r);
+			                        bus_release_resource(child, pr->type, rid, r);
+						break;
+					}
+				}
+			}
+			break;
+		case SYS_RES_IRQ:
+			for (i = pr->min; i <= pr->max;
+				i++) {
+				err = bus_set_resource(child, SYS_RES_IRQ, 0, i, 1);
+				if (!err) {
+					r = bus_alloc_resource(child, SYS_RES_IRQ, &rid, 0ul, ~0ul, 1, RF_ACTIVE);
+					if (r) { 
+						pr->resource_addr = (u_long)rman_get_start(r);
+			                        bus_release_resource(child, SYS_RES_IRQ, rid, r);
+						break;
+					}
+				}
+			}
+			break;
+		default:
+			return EINVAL;
+		}
+		device_delete_child(pccarddev, child);
 		break;
 	}
 	return(0);
--- sys/pccard/cardinfo.h.orig	Sun Jan 16 15:44:44 2000
+++ sys/pccard/cardinfo.h	Sun Aug 20 11:59:38 2000
@@ -49,6 +49,7 @@
 #define PIOCSPOW	_IOW('P', 9, struct power) /* Set power structure */
 #define PIOCSVIR	_IOW('P', 10, int)	/* Virtual insert/remove */
 #define PIOCSBEEP	_IOW('P', 11, int)		/* Select Beep */
+#define PIOCSRESOURCE	_IOWR('P', 12, struct pccard_resource)	/* get resource info */
 /*
  *	Debug codes.
  */
@@ -135,6 +136,18 @@
 	int	vcc;
 	int	vpp;
 };
+
+/*
+ *	Th PC-Card resource IOC_GET_RESOURCE_RANGE
+ */
+struct pccard_resource {
+	int		type;
+	u_long		size;
+	u_long		min;
+	u_long		max;
+	u_long		resource_addr;
+};
+
 
 /*
  *	Other system limits

---------- userland program----------
begin 644 pccard-kernel-resource-20000820.tar.gz
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
IO?%[^6=P*:644DHII9122BFEE%)**:644DHII92R+?\!66F'.``H```9
`
end


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-mobile" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200008200445.e7K4jp402239>