summaryrefslogtreecommitdiff
path: root/extras/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'extras/firmware')
-rw-r--r--extras/firmware/Makefile17
-rwxr-xr-xextras/firmware/firmware.sh27
-rw-r--r--extras/firmware/firmware_helper.c142
3 files changed, 30 insertions, 156 deletions
diff --git a/extras/firmware/Makefile b/extras/firmware/Makefile
index a30c0fcd5b..55ba22386f 100644
--- a/extras/firmware/Makefile
+++ b/extras/firmware/Makefile
@@ -1,14 +1,11 @@
# Makefile for udev extra invoked from the udev main Makefile
#
-# Copyright (C) 2004-2005 Kay Sievers <kay.sievers@vrfy.org>
+# Copyright (C) 2004-2006 Kay Sievers <kay.sievers@vrfy.org>
#
# Released under the GNU General Public License, version 2.
#
-PROG = firmware_helper
-OBJ =
-HEADERS =
-GEN_HEADERS =
+PROG = firmware.sh
MAN_PAGES =
prefix =
@@ -29,14 +26,6 @@ all: $(PROG) $(MAN_PAGES)
.PHONY: all
.DEFAULT: all
-%.o: %.c $(GEN_HEADERS)
- $(E) " CC " $@
- $(Q) $(CC) -c $(CFLAGS) $< -o $@
-
-$(PROG): %: $(HEADERS) %.o $(OBJS)
- $(E) " LD " $@
- $(Q) $(LD) $(LDFLAGS) $@.o $(OBJS) -o $@ $(LIBUDEV) $(LIB_OBJS)
-
# man pages
%.8: %.xml
$(E) " XMLTO " $@
@@ -45,7 +34,6 @@ $(PROG): %: $(HEADERS) %.o $(OBJS)
clean:
$(E) " CLEAN "
- $(Q) rm -f $(PROG) $(OBJS) $(GEN_HEADERS)
.PHONY: clean
install-bin: all
@@ -67,3 +55,4 @@ uninstall-man:
install-config:
@echo "no config file to install"
.PHONY: install-config
+
diff --git a/extras/firmware/firmware.sh b/extras/firmware/firmware.sh
new file mode 100755
index 0000000000..fb2f2a792d
--- /dev/null
+++ b/extras/firmware/firmware.sh
@@ -0,0 +1,27 @@
+#!/bin/sh -e
+
+FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware"
+
+err() {
+ echo "$@" >&2
+ if [ -x /bin/logger ]; then
+ /bin/logger -t "${0##*/}[$$]" "$@"
+ fi
+}
+
+if [ ! -e /sys$DEVPATH/loading ]; then
+ err "udev firmware loader misses sysfs directory"
+ exit 1
+fi
+
+for DIR in $FIRMWARE_DIRS; do
+ [ -e "$DIR/$FIRMWARE" ] || continue
+ echo 1 > /sys/$DEVPATH/loading
+ cat "$DIR/$FIRMWARE" > /sys/$DEVPATH/data
+ echo 0 > /sys/$DEVPATH/loading
+ exit 0
+done
+
+echo -1 > /sys/$DEVPATH/loading
+err "Cannot find firmware file '$FIRMWARE'"
+exit 1
diff --git a/extras/firmware/firmware_helper.c b/extras/firmware/firmware_helper.c
deleted file mode 100644
index ca1c43814f..0000000000
--- a/extras/firmware/firmware_helper.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * A simple firmware helper program.
- *
- * Copyright 2005 Red Hat, Inc.
- *
- * 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 version 2 of the License.
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
-#include "../../udev.h"
-
-#define FIRMWARE_PATH "/lib/firmware"
-#define PATH_SIZE 256
-
-#ifdef USE_LOG
-void log_message(int priority, const char *format, ...)
-{
- va_list args;
- static int udev_log = -1;
-
- if (udev_log == -1) {
- const char *value;
-
- value = getenv("UDEV_LOG");
- if (value)
- udev_log = log_priority(value);
- else
- udev_log = LOG_ERR;
- }
-
- if (priority > udev_log)
- return;
-
- va_start(args, format);
- vsyslog(priority, format, args);
- va_end(args);
-}
-#endif
-
-/* Set the 'loading' attribute for a firmware device.
- * 1 == currently loading
- * 0 == done loading
- * -1 == error
- */
-static int set_loading(const char *device, int value) {
- char loading_path[PATH_SIZE];
- int rc;
- FILE *f;
-
- snprintf(loading_path, sizeof(loading_path), "/sys/%s/loading", device);
- loading_path[sizeof(loading_path)-1] = '\0';
- f = fopen(loading_path, "w");
- if (!f)
- return -1;
- rc = fprintf(f, "%d", value);
- fclose(f);
- if (rc < 0)
- return rc;
- return 0;
-}
-
-int main(int argc, char **argv) {
- char *devpath, *firmware, *action, *driver;
- char fw_path[PATH_SIZE];
- char data_path[PATH_SIZE];
- int fw_fd;
- char *fw_buffer;
- size_t fw_buffer_size;
- size_t count;
- int rc = 0;
-
- logging_init("firmware_helper");
-
- driver = getenv("PHYSDEVDRIVER");
- if (!driver)
- driver = "(unknown)";
- devpath = getenv("DEVPATH");
- firmware = getenv("FIRMWARE");
- action = getenv("ACTION");
- if (!devpath || !firmware || !action || strcmp(action,"add") != 0) {
- err("missing devpath, action or firmware");
- exit(1);
- }
-
- dbg("try to load firmware '%s' for '%s'", firmware, devpath);
- set_loading(devpath, 1);
-
- snprintf(fw_path, sizeof(fw_path), "%s/%s", FIRMWARE_PATH, firmware);
- fw_path[sizeof(fw_path)-1] = '\0';
- if (file_map(fw_path, &fw_buffer, &fw_buffer_size) != 0 || fw_buffer_size == 0) {
- err("could not load firmware '%s' for '%s'", fw_path, devpath);
- fw_buffer = NULL;
- goto out_err;
- }
-
- snprintf(data_path, sizeof(data_path), "/sys/%s/data", devpath);
- data_path[sizeof(data_path)-1] = '\0';
- fw_fd = open(data_path, O_RDWR);
- if (fw_fd < 0) {
- rc = errno;
- goto out_err;
- }
-
- count = 0;
- while (count < fw_buffer_size) {
- ssize_t c;
-
- c = write(fw_fd, fw_buffer+count, fw_buffer_size-count);
- if (c <= 0) {
- rc = errno;
- close(fw_fd);
- goto out_err;
- }
- count += c;
- }
-
- close(fw_fd);
- file_unmap(fw_buffer, fw_buffer_size);
- set_loading(devpath, 0);
- info("loaded '%s' for device '%s'", fw_path, devpath);
- logging_close();
- return 0;
-
-out_err:
- if (fw_buffer)
- file_unmap(fw_buffer, fw_buffer_size);
- set_loading(devpath, -1);
-
- err("error loading '%s' for device '%s' with driver '%s'", fw_path, devpath, driver);
- logging_close();
- return rc;
-}