File: microcode_upload.pl

package info (click to toggle)
em8300 0.14.0-2
  • links: PTS
  • area: contrib
  • in suites: sarge
  • size: 2,828 kB
  • ctags: 1,660
  • sloc: ansic: 11,095; sh: 8,892; perl: 1,338; makefile: 479
file content (68 lines) | stat: -rwxr-xr-x 1,671 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/perl

my @devs = ("/dev/em8300-0","/dev/em8300-1","/dev/em8300-2","/dev/em8300-3");
$_IOC_NRBITS    =  8;
$_IOC_TYPEBITS  =  8;
$_IOC_SIZEBITS  = 14;
$_IOC_DIRBITS   =  2;

$_IOC_NRMASK    = ((1 << $_IOC_NRBITS)-1);
$_IOC_TYPEMASK  = ((1 << $_IOC_TYPEBITS)-1);
$_IOC_SIZEMASK  = ((1 << $_IOC_SIZEBITS)-1);
$_IOC_DIRMASK   = ((1 << $_IOC_DIRBITS)-1);

$_IOC_NRSHIFT    = 0;
$_IOC_TYPESHIFT  = ($_IOC_NRSHIFT+$_IOC_NRBITS);
$_IOC_SIZESHIFT  = ($_IOC_TYPESHIFT+$_IOC_TYPEBITS);
$_IOC_DIRSHIFT   = ($_IOC_SIZESHIFT+$_IOC_SIZEBITS);

sub _IOC {
  local ($dir,$type,$nr,$size) = @_;

  ((($dir)  << $_IOC_DIRSHIFT) | 
   ((ord($type)) << $_IOC_TYPESHIFT) | 
   (($nr)   << $_IOC_NRSHIFT) | 
   (($size) << $_IOC_SIZESHIFT));
}

sub EMCTL_IOCTL_INIT { _IOC(1,'C',0,8 );}
sub EMCTL_IOCTL_READREG { _IOC(3,'C',1,8);}
sub EMCTL_IOCTL_WRITEREG { _IOC(1,'C',2,8); }
sub EMCTL_IOCTL_GETSTATUS { _IOC(2,'C',3,shift)}

# Read microcode file
#open (UCODE,"<$ARGV[0]") or die("Can't open microcode file: $ARGV[0]");
if (@ARGV < 1) {
    open (UCODE,"/usr/share/misc/em8300.uc") or die("ERROR: /usr/share/misc/em8300.uc not found");
} else {
    open (UCODE, "$ARGV[0]") or die ("Can't open microcode file: $ARGV[0]");
}

undef $/;
$ucode=<UCODE>;
close UCODE;

$opened_one = 0;

# Open device
foreach (@devs){
  if (!open(DEV,"<$_")) {
    if (!$opened_one) {
      die("Can't open $_\n");
    }
    exit(0);
  }
  $opened_one = 1;

  # Prepare ioctl
  $initparams = pack("PI", $ucode, length($ucode));

  if(!ioctl(DEV, &EMCTL_IOCTL_INIT, $initparams)) {
    print "Microcode upload to $_ failed: $!\n";
    exit(1);
  }

  print "Microcode uploaded to $_\n";

  close DEV;
}