iPXE
Functions | Variables
usb_settings.c File Reference

USB device settings. More...

#include <stdio.h>
#include <errno.h>
#include <ipxe/usb.h>
#include <ipxe/settings.h>
#include <ipxe/init.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static int usb_settings_applies (struct settings *settings __unused, const struct setting *setting)
 Check applicability of USB device setting. More...
 
static int usb_settings_fetch (struct settings *settings __unused, struct setting *setting, void *data, size_t len)
 Fetch value of USB device setting. More...
 
static void usb_settings_init (void)
 Initialise USB device settings. More...
 
struct init_fn usb_settings_init_fn __init_fn (INIT_NORMAL)
 USB device settings initialiser. More...
 

Variables

static const struct settings_scope usb_settings_scope
 USB device settings scope. More...
 
static struct settings_operations usb_settings_operations
 USB device settings operations. More...
 
static struct settings usb_settings
 USB device settings. More...
 

Detailed Description

USB device settings.

Definition in file usb_settings.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ usb_settings_applies()

static int usb_settings_applies ( struct settings *settings  __unused,
const struct setting setting 
)
static

Check applicability of USB device setting.

Parameters
settingsSettings block
settingSetting
Return values
appliesSetting applies within this settings block

Definition at line 48 of file usb_settings.c.

49  {
50 
51  return ( setting->scope == &usb_settings_scope );
52 }
A setting.
Definition: settings.h:23
const struct settings_scope * scope
Setting scope (or NULL)
Definition: settings.h:49
static const struct settings_scope usb_settings_scope
USB device settings scope.
Definition: usb_settings.c:39

References setting::scope, and usb_settings_scope.

◆ usb_settings_fetch()

static int usb_settings_fetch ( struct settings *settings  __unused,
struct setting setting,
void *  data,
size_t  len 
)
static

Fetch value of USB device setting.

Parameters
settingsSettings block
settingSetting to fetch
dataBuffer to fill with setting data
lenLength of buffer
Return values
lenLength of setting data, or negative error

Definition at line 63 of file usb_settings.c.

65  {
66  uint8_t *dst = data;
67  const uint8_t *src;
68  const uint8_t *desc;
69  struct usb_bus *bus;
70  struct usb_device *usb;
71  int tag_direction;
72  unsigned int tag_busdev;
73  unsigned int tag_offset;
74  unsigned int tag_len;
75  unsigned int index;
76  int rc;
77 
78  /* Extract parameters from tag */
79  tag_direction = ( ( setting->tag & ( 1 << 31 ) ) ? +1 : -1 );
80  tag_busdev = ( ( setting->tag >> 16 ) & 0x7fff );
81  tag_offset = ( ( setting->tag >> 8 ) & 0xff );
82  tag_len = ( ( setting->tag >> 0 ) & 0xff );
83 
84  /* Locate USB device */
85  bus = find_usb_bus ( USB_BUS ( tag_busdev ) );
86  if ( ! bus )
87  return -ENODEV;
88  usb = find_usb ( bus, USB_DEV ( tag_busdev ) );
89  if ( ! usb )
90  return -ENODEV;
91  desc = ( ( const uint8_t * ) &usb->device );
92 
93  /* Following the usage of SMBIOS settings tags, a <length> of
94  * zero indicates that the byte at <offset> contains a string
95  * index. An <offset> of zero indicates that the <length>
96  * contains a literal string index.
97  *
98  * Since the byte at offset zero can never contain a string
99  * index, and a literal string index can never be zero, the
100  * combination of both <length> and <offset> being zero
101  * indicates that the entire structure is to be read.
102  *
103  * By default we reverse the byte direction since USB values
104  * are little-endian and iPXE settings are big-endian. We
105  * invert this default when reading the entire structure.
106  */
107  if ( ( tag_len == 0 ) && ( tag_offset == 0 ) ) {
108  tag_len = sizeof ( usb->device );
109  tag_direction = -tag_direction;
110  } else if ( ( tag_len == 0 ) || ( tag_offset == 0 ) ) {
111  index = tag_len;
112  if ( ( ! index ) && ( tag_offset < sizeof ( usb->device ) ) )
113  index = desc[tag_offset];
114  if ( ( rc = usb_get_string_descriptor ( usb, index, 0, data,
115  len ) ) < 0 ) {
116  return rc;
117  }
118  if ( ! setting->type )
119  setting->type = &setting_type_string;
120  return rc;
121  }
122 
123  /* Limit length */
124  if ( tag_offset > sizeof ( usb->device ) ) {
125  tag_len = 0;
126  } else if ( ( tag_offset + tag_len ) > sizeof ( usb->device ) ) {
127  tag_len = ( sizeof ( usb->device ) - tag_offset );
128  }
129 
130  /* Copy data, reversing endianness if applicable */
131  dst = data;
132  src = ( desc + tag_offset );
133  if ( tag_direction < 0 )
134  src += ( tag_len - 1 );
135  if ( len > tag_len )
136  len = tag_len;
137  for ( ; len-- ; src += tag_direction, dst++ )
138  *dst = *src;
139 
140  /* Set type to ":hexraw" if not already specified */
141  if ( ! setting->type )
142  setting->type = &setting_type_hexraw;
143 
144  return tag_len;
145 }
#define USB_BUS(busdev)
Extract USB bus address.
Definition: usb.h:66
static const void * src
Definition: string.h:47
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct usb_bus * find_usb_bus(unsigned int address)
Find USB bus by address.
Definition: usb.c:2219
long index
Definition: bigint.h:61
uint64_t desc
Microcode descriptor list physical address.
Definition: ucode.h:12
struct usb_device * find_usb(struct usb_bus *bus, unsigned int address)
Find USB device by address.
Definition: usb.c:1734
uint64_t tag
Setting tag, if applicable.
Definition: settings.h:43
const struct setting_type * type
Setting type.
Definition: settings.h:36
A USB device.
Definition: usb.h:722
#define ENODEV
No such device.
Definition: errno.h:509
unsigned char uint8_t
Definition: stdint.h:10
struct usb_device_descriptor device
Device descriptor.
Definition: usb.h:734
A setting.
Definition: settings.h:23
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t len
Length.
Definition: ena.h:14
A USB bus.
Definition: usb.h:965
uint8_t bus
Bus.
Definition: edd.h:14
int usb_get_string_descriptor(struct usb_device *usb, unsigned int index, unsigned int language, char *buf, size_t len)
Get USB string descriptor.
Definition: usb.c:915
#define USB_DEV(busdev)
Extract USB device address.
Definition: usb.h:69

References bus, data, desc, usb_device::device, ENODEV, find_usb(), find_usb_bus(), index, len, rc, src, setting::tag, setting::type, USB_BUS, USB_DEV, and usb_get_string_descriptor().

◆ usb_settings_init()

static void usb_settings_init ( void  )
static

Initialise USB device settings.

Definition at line 163 of file usb_settings.c.

163  {
164  int rc;
165 
166  if ( ( rc = register_settings ( &usb_settings, NULL, "usb" ) ) != 0 ) {
167  DBG ( "USB could not register settings: %s\n",
168  strerror ( rc ) );
169  return;
170  }
171 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition: settings.c:475
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static struct settings usb_settings
USB device settings.
Definition: usb_settings.c:154

References DBG, NULL, rc, register_settings(), strerror(), and usb_settings.

◆ __init_fn()

struct init_fn usb_settings_init_fn __init_fn ( INIT_NORMAL  )

USB device settings initialiser.

Variable Documentation

◆ usb_settings_scope

const struct settings_scope usb_settings_scope
static

USB device settings scope.

Definition at line 39 of file usb_settings.c.

Referenced by usb_settings_applies().

◆ usb_settings_operations

struct settings_operations usb_settings_operations
static
Initial value:
= {
}
static int usb_settings_applies(struct settings *settings __unused, const struct setting *setting)
Check applicability of USB device setting.
Definition: usb_settings.c:48
static int usb_settings_fetch(struct settings *settings __unused, struct setting *setting, void *data, size_t len)
Fetch value of USB device setting.
Definition: usb_settings.c:63

USB device settings operations.

Definition at line 148 of file usb_settings.c.

◆ usb_settings

struct settings usb_settings
static
Initial value:
= {
.refcnt = NULL,
.default_scope = &usb_settings_scope,
}
struct list_head siblings
Sibling settings blocks.
Definition: settings.h:140
static struct settings_operations usb_settings_operations
USB device settings operations.
Definition: usb_settings.c:148
struct list_head children
Child settings blocks.
Definition: settings.h:142
#define LIST_HEAD_INIT(list)
Initialise a static list head.
Definition: list.h:30
static const struct settings_scope usb_settings_scope
USB device settings scope.
Definition: usb_settings.c:39
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static struct settings usb_settings
USB device settings.
Definition: usb_settings.c:154

USB device settings.

Definition at line 154 of file usb_settings.c.

Referenced by usb_settings_init().